我正在调试一些东西并发现 JavaScript 中的一些奇怪之处:
alert(1=='') ==> false
alert(0=='') ==> true
alert(-1=='') ==> false
0 应该 = '0' 的隐含字符串比较是有道理的。这适用于所有非零值,但为什么不是零呢?
我正在调试一些东西并发现 JavaScript 中的一些奇怪之处:
alert(1=='') ==> false
alert(0=='') ==> true
alert(-1=='') ==> false
0 应该 = '0' 的隐含字符串比较是有道理的。这适用于所有非零值,但为什么不是零呢?
根据关于Javascript 比较运算符的 Mozilla 文档
如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格的比较。如果操作数是数字或布尔值,则操作数将转换为数字;如果任一操作数是字符串,则将另一个操作数转换为字符串
实际发生的是字符串被转换为数字。例如:
1 == '1'
变1 == Number('1')
变1 == 1
:true
那么试试这个:
1 == '1.'
变成1 == Number('1.')
变成1 == 1
:true
如果他们成为字符串,那么你会得到'1' == '1.'
,这将是错误的。
恰巧Number('') == 0
,因此0 == ''
是真的
当 javascript 进行隐式类型转换时,空字符串文字将匹配 0 整数。像这样进行比较,您将得到预期的结果:
alert(1==='') ==> false
alert(0==='') ==> false
alert(-1==='') ==> false
ECMA-262,第 3 版,11.9.3 关于x == y
,第 16 步:
如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
空字符串在比较之前''
被转换为0
。
这只是 JavaScript 妥协中真正可怕的破坏之一。'' 和 0 都是未初始化的值(等于 boolean false),因此相等。
为了保护自己免受此类奇怪的错误的影响,最好始终使用 === 运算符。
与 PHP 一样,Javascript 是弱类型的*。因此,当您将 0 与 '' 进行比较时,JS 引擎会将它们转换为类似的数据类型。由于 0 和 '' 都等同于 boolean(false),因此“false == false”为真。
*弱类型语言不要求变量是任何特定的数据类型,因此您可以将一个变量设置为字符串,将其更改为 int、float 并返回到字符串,而处理器不会抛出错误。