考虑空JavaScript数组:的JavaScript类型转换
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
如何解释呢? 规则是什么?
考虑空JavaScript数组:的JavaScript类型转换
var a = [];
alert(a == false); // shows true
alert(!a); // shows false!
如何解释呢? 规则是什么?
从http://forums.whirlpool.net.au/archive/966449:
a == false
:
在这种情况下,左手侧的类型是对象,右手边的类型是布尔值。 Javascript首先将布尔转换为数字,产生0
。然后它将对象转换为“基元”,产生空字符串。接下来,它将空字符串与0
进行比较。空字符串被转换为数字,产生0
,这在数字上等于右侧的0
,因此整个表达式的结果是true
。
查看ECMAScript spec的§11.9.3了解所有血淋淋的细节。
(!a)
:
在这种情况下的Javascript转换对象为布尔真反,然后它,造成假。
!
运算符检查其操作数是否为“falsy”。
以下为真:
!false
!0
!null
!NaN
!undefined
!""
==
运算符检查松散平等,这与虚假无关。
具体而言,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
,然后false
强制转换成0
:
[] == false
0 == false
0 == 0
这是真的。
!
运算符强制为布尔值,然后反转该值。 []
布尔值是true
(与任何对象一样)。然后反成为false
![]
!true
false
的==
操作时,一个操作数,如果布尔,类型转换对方号码。
[] == 0;
等同于:
0 == 0;
你可以看到在规范的The Abstract Equality Comparison Algorithm的完整细节。
正如你可以看到,一个空数组对象,当转换为数字,产生0
:
+[]; // 0
Number(0);
这是真的,因为它的toString方法产生一个空字符串,例如:
[].toString(); // ""
+""; // 0
Number(""); // 0
不知道这是否回答这个问题,但有一个新的库来解决所有Javascript的类型错误:
在一句话中,Typecast解决了所有简单问题,因此您可以专注于大型问题。通过在Javascript中为强类型变量创建一个完整平台,Typecast修复了Javascript的问题。
[为什么警告(!!“0”)和警报(false ==“0”)都可以在JavaScript中输出true](http://stackoverflow.com/questions/4567393/why-do -alert0-and-alertfalse-0-both-output-true-in-javascript) – SLaks 2011-01-07 14:25:29
感谢您的指点。但不完全是,我要求通用规则。 – Evgenyt 2011-01-07 14:35:07
当涉及到松散的`==`运算符时,规则不是那么通用。你应该阅读[这个答案]引用的抽象平等比较算法(http://stackoverflow.com/questions/4626361/javascript-type-casting/4626420#4626420)。 – user113716 2011-01-07 14:39:47