我正在调试一些东西并在JavaScript中发现了一些奇怪的东西:
alert(1=='') ==> false
alert(0=='') ==> true
alert(-1=='') ==> false
隐含的字符串比较0应该为'0'是有意义的。对于所有非零值都是如此,但为什么不为零?
答案 0 :(得分:18)
根据Javascript Comparison Operators
上的Mozilla文档如果两个操作数的类型不同,则JavaScript会转换 操作数然后适用严格 比较。如果任一操作数是a 数字或布尔值,操作数是 转换为数字;如果是的话 操作数是一个字符串,另一个是 转换为字符串
实际发生的是字符串被转换为数字。 例如:
1 == '1'
变为1 == Number('1')
变为1 == 1
:true
然后尝试这个:
1 == '1.'
变为1 == Number('1.')
变为1 == 1
:true
如果他们成为字符串,那么你会得到'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
==不具传递性。