隐含字符串比较,0 ='',但1 ='1'

时间:2009-01-20 19:14:53

标签: javascript

我正在调试一些东西并在JavaScript中发现了一些奇怪的东西:

alert(1=='') ==> false
alert(0=='') ==> true
alert(-1=='') ==> false

隐含的字符串比较0应该为'0'是有意义的。对于所有非零值都是如此,但为什么不为零?

6 个答案:

答案 0 :(得分:18)

根据Javascript Comparison Operators

上的Mozilla文档
  

如果两个操作数的类型不同,则JavaScript会转换   操作数然后适用严格   比较。如果任一操作数是a   数字或布尔值,操作数是   转换为数字;如果是的话   操作数是一个字符串,另一个是   转换为字符串

实际发生的是字符串被转换为数字。 例如:

1 == '1'变为1 == Number('1')变为1 == 1true

然后尝试这个: 1 == '1.'变为1 == Number('1.')变为1 == 1true 如果他们成为字符串,那么你会得到'1' == '1.',这将是错误的。

Number('') == 0就是这样,因此0 == ''是真的

答案 1 :(得分:10)

当javascript执行隐式类型转换时,空字符串文字将匹配0整数。做这样的比较,你会得到你期望的结果:

alert(1==='') ==> false
alert(0==='') ==> false
alert(-1==='') ==> false

答案 2 :(得分:4)

ECMA-262,第3版,11.9.3关于x == y,第16步:

  

如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。

在比较之前,空字符串''会转换为0

答案 3 :(得分:3)

这只是进入JavaScript妥协的真正可怕的破坏之一。 ''和0都是未初始化的值(等于布尔值假),因此等于。

为了保护自己免受这种奇怪的错误,最好总是使用===运算符。

答案 4 :(得分:2)

与PHP一样,Javascript是弱类型*。因此,当您将0与''进行比较时,JS引擎会将它们转换为类似的数据类型。由于0和''都等于布尔值(false),“false == false”为真。

*弱类型语言不要求变量是任何特定的数据类型,因此您可以将一个变量设置为字符串,将其更改为int,float,然后返回到字符串,而不会使处理器抛出错误。

答案 5 :(得分:2)

在许多语言中,空字符串可以强制为false。

注意与==而不是===:

进行比较
alert('' == '0'); //false  
alert(0 == ''); // true  
alert(0 =='0'); // true

==不具传递性。