Javascript 中的类型强制究竟是什么?
例如,使用 of==
而不是===
?
Javascript 中的类型强制究竟是什么?
例如,使用 of==
而不是===
?
类型强制意味着当一个运算符的操作数是不同类型时,其中一个将转换为另一个操作数类型的“等效”值。例如,如果你这样做:
boolean == integer
布尔操作数将转换为整数:false
变成0
,true
变成 1。然后比较两个值。
但是,如果您使用非转换比较运算符===
,则不会发生此类转换。当操作数的类型不同时,此运算符返回false
,并且仅比较相同类型的值。
你可以在You Don't Know JS 中找到对 JavaScript 强制规则的很好解释,在MDN 中可以找到更多面向参考的文档。
让我们从对类型系统的简短介绍开始,我认为这将有助于您理解类型强制的一般概念。
语言的类型系统定义了规则,这些规则告诉我们该语言中存在哪些类型的数据以及如何使用不同的运算符组合它们。例如,一个这样的规则可能指定加号 (+) 运算符仅作用于数字。这些规则的存在主要是为了防止您用脚射击。但是当程序员在程序中打破这个规则时会发生什么?即使语言认为这些表达式没有任何意义,也没有什么可以阻止程序员输入{} + {}
或输入“hello” + 5
程序。
在这些情况下最终会发生什么取决于语言对其类型规则的严格程度。
语言类型系统通常会持有关于你违反规则的两种立场之一:
类型系统在其规则方面占据首位的语言通俗地称为“强类型”语言。他们严格要求不让您违反规则。那些采用第二种方法(例如 JavaScript)的语言被称为“弱类型”或“松散类型”语言。当然,您可以违反规则,但是当它强制转换您在程序中描述的数据类型以符合其规则时,请不要感到惊讶。这种行为被称为……(鼓声)……类型强制。
现在让我们看一些 JavaScript 的例子。首先,让我们从一个不会导致类型强制的表达式开始。
5 + 5
对两个数字使用 + 运算符,这是完全有效的。程序会将 + 视为“相加”并愉快地将两个数字相加。无需转换。
但是关于 …
[] + 5
哦哦。在 JavaScript 中,+
可以表示添加两个数字或连接两个字符串。在这种情况下,我们既没有两个数字也没有两个字符串。我们只有一个数字和一个对象。根据 JavaScript 的类型规则,这没有逻辑意义。因为它原谅你违反它的规则,而不是崩溃它无论如何都会试图理解它。那么 JavaScript 是做什么的呢?好吧,它知道如何连接字符串,因此它将 [] 和 5 都转换为字符串,结果是字符串值“5”。
与比较运算符==
和 有===
什么关系?为什么有两个比较运算符?
==
不能免于 JavaScript 的类型转换行为。诸如此类的表达式5 == “5”
将评估为真,因为 JavaScript 将尝试转换其中之一,以便比较相同类型的数据。
在许多情况下,这是不可取的,因为您可能想知道要比较的某些数据是否属于不同类型,以便您可以决定如何处理。这就是===
运算符的用武之地。当您使用 时===
,不会发生类型转换。因此,表达式的5 === “5”
计算结果为 false。
在 Python 中,如果您尝试添加字符串和整数,则会出现错误:
>>> "hi" + 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
然而在 JavaScript 中,你没有。将10
被转换为字符串:
> "hi" + 10
"hi10"
“类型强制”只是上面的一个花哨的用词不当。实际上,这两种语言都没有 Java 或 C 或其他具有静态类型系统的语言意义上的“类型”。语言如何处理各种非静态类型值之间的交互是一个选择和约定的问题。
让我用下面的例子解释类型强制
类型强制意味着 Javascript 自动(即时)将变量从一种数据类型转换为另一种数据类型
例如:123 + "4"
通常会引发错误,但在 Javascript 中由于类型强制,它会产生1234
一个字符串
if(23 == "23"){
console.log(" this line is inside the loop and is executed ");
}
在上面的代码中,由于类型强制 - JavaScript 认为23
(number) 和"23"
(string) 是一回事。这使条件为真并打印 console.log
在另一种情况下
if(23 === "23"){
console.log(" this line is inside the loop and is NOT executed");
}
在===
情况下,JavaScript没有做类型强制,并且因为23
是一个数字,"23"
是String,并因为===
这两种数据类型是不同的,导致病情的假。它不打印 console.log
简单来说
在这种情况下,=
它是一个赋值运算符 - 它分配诸如var a = 3;
等的值
(以下运算符用于比较)
在这种情况下,==
Javascript 将数据类型转换/强制转换为另一种数据类型,然后进行比较。
在这种情况下,===
Javascript 不会转换/强制数据类型
为了避免错误和调试目的===
,主要使用
请让我知道上述信息的准确性。
当 Javascript 引擎必须执行需要数据为特定类型的特定操作时,就会发生 javascript 中的类型强制。当引擎遇到某种类型的数据不适用于该操作时,它就会将数据强制转换为某种类型。这是必需的,因为 javascript 中的变量是动态类型的,这意味着可以为给定的变量分配任何类型的值。
if(1){
// 1 gets coerced to true
}
if(4 > '3') {
// 3 gets coerced into a number
}
44 == "44" // true, the string 44 gets converted to a nr
在 javascript coercion 中,true
除了以下被强制转换为 的值外,所有值都被转换为false
:
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // false
console.log(!!false); // false
还要注意,在上面的例子中,double ! 使用运算符。这 !标记运算符将一个值强制转换为具有相反值的布尔值。我们可以两次使用此运算符将任何值转换为布尔值。