2011-01-07 31 views
5

考虑空JavaScript数组:的JavaScript类型转换

var a = []; 
alert(a == false); // shows true 
alert(!a); // shows false! 

如何解释呢? 规则是什么?

+1

[为什么警告(!!“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

+1

感谢您的指点。但不完全是,我要求通用规则。 – Evgenyt 2011-01-07 14:35:07

+2

当涉及到松散的`==`运算符时,规则不是那么通用。你应该阅读[这个答案]引用的抽象平等比较算法(http://stackoverflow.com/questions/4626361/javascript-type-casting/4626420#4626420)。 – user113716 2011-01-07 14:39:47

回答

12

http://forums.whirlpool.net.au/archive/966449

a == false

在这种情况下,左手侧的类型是对象,右手边的类型是布尔值。 Javascript首先将布尔转换为数字,产生0。然后它将对象转换为“基元”,产生空字符串。接下来,它将空字符串与0进行比较。空字符串被转换为数字,产生0,这在数字上等于右侧的0,因此整个表达式的结果是true

查看ECMAScript spec的§11.9.3了解所有血淋淋的细节。

(!a)

在这种情况下的Javascript转换对象为布尔真反,然后它,造成假。

8

!运算符检查其操作数是否为“falsy”。

以下为真:

  • !false
  • !0
  • !null
  • !NaN
  • !undefined
  • !""

==运算符检查松散平等,这与虚假无关。

具体而言,a == b将转换为操作数为数字,然后比较数字。
包含数字的字符串转换为它们包含的数字;布尔变换为01
如果已定义,则通过调用valueOf来转换对象。

因此,下列所有的都为真:

  • "1" == 1
  • "0" == false
  • "1" == true
  • "2" != true
  • "2" != false
  • ({ valueOf:function() { return 2; } }) == 2
  • ({ valueOf:function() { return 1; } }) == true
1

当经由操作者==比较对象为原始值,对象胁迫到原始值本身(数字或字符串)。在这种情况下[]强制转换成0,然后false强制转换成0

[] == false 
0 == false 
0 == 0 

这是真的。

!运算符强制为布尔值,然后反转该值。 []布尔值是true(与任何对象一样)。然后反成为false

![] 
!true 
false 
4

==操作时,一个操作数,如果布尔,类型转换对方号码。

[] == 0; 

等同于:

0 == 0; 

你可以看到在规范的The Abstract Equality Comparison Algorithm的完整细节。

正如你可以看到,一个空数组对象,当转换为数字,产生0

+[]; // 0 
Number(0); 

这是真的,因为它的toString方法产生一个空字符串,例如:

[].toString(); // "" 

+""; // 0 
Number(""); // 0 
0

不知道这是否回答这个问题,但有一个新的库来解决所有Javascript的类型错误:

Typecast.js

在一句话中,Typecast解决了所有简单问题,因此您可以专注于大型问题。通过在Javascript中为强类型变量创建一个完整平台,Typecast修复了Javascript的问题。