Evg*_*nyt 5 javascript types casting
考虑空的JavaScript数组:
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
Run Code Online (Sandbox Code Playgroud)
怎么解释这个?规则是什么?
Rya*_* Li 12
来自http://forums.whirlpool.net.au/archive/966449:
a == false:
在这种情况下,左侧的类型是对象,右侧的类型是布尔值.Javascript首先将布尔值转换为数字,然后生成0.然后它将对象转换为"基元",产生空字符串.接下来,它将空字符串与之比较0.空字符串被转换为数字,屈服0,在数字上等于0右边的数字,因此整个表达式的结果是true.
有关所有血腥细节,请参阅ECMAScript规范的 §11.9.3 .
(!a):
在这种情况下,Javascript将对象转换为布尔值true,然后将其反转,结果为false.
该!运营商检查是否它的操作数是"falsy".
以下是真实的:
!false!0!null!NaN!undefined!""该==运营商检查松动的平等,它有无关falsiness.
具体来说,a == b将操作数转换为数字,然后比较数字.
包含数字的字符串会转换为它们包含的数字; 布尔值转换为0和1.如果已定义,则
通过调用来转换对象valueOf.
因此,以下所有都是如此:
"1" == 1"0" == false"1" == true"2" != true"2" != false({ valueOf:function() { return 2; } }) == 2({ valueOf:function() { return 1; } }) == true==当操作数之一为布尔值时的运算符,将另一个操作数类型转换为数字。
[] == 0;
Run Code Online (Sandbox Code Playgroud)
相当于:
0 == 0;
Run Code Online (Sandbox Code Playgroud)
您可以在规范上查看抽象平等比较算法的完整详细信息。
如您所见,一个空数组对象在转换为 Number 时会产生0:
+[]; // 0
Number(0);
Run Code Online (Sandbox Code Playgroud)
这真的是因为它的 toString 方法产生了一个空字符串,例如:
[].toString(); // ""
+""; // 0
Number(""); // 0
Run Code Online (Sandbox Code Playgroud)