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

IT技术 javascript
2021-03-05 13:59:20

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

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

0 应该 = '0' 的隐含字符串比较是有道理的。这适用于所有非零值,但为什么不是零呢?

6个回答

根据关于Javascript 比较运算符的 Mozilla 文档

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

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

1 == '1'1 == Number('1')1 == 1true

那么试试这个: 1 == '1.'变成1 == Number('1.')变成1 == 1true 如果他们成为字符串,那么你会得到'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

@RoBorg:链接不适用于 PDF,谷歌搜索 ECMA-262 并单击第一个链接并没有那么不方便。
2021-04-20 13:59:20
@Christoph 也没有在谷歌上搜索“javascript 相等运算符”,但这不是重点
2021-05-07 13:59:20
@RoBorg:我的观点是,它是不可能通过深层链接到正确的部分,并提供一个链接到一个现成的标准文件是不是真的是我的重点之一-那么,什么你的观点?
2021-05-11 13:59:20

这只是 JavaScript 妥协中真正可怕的破坏之一。'' 和 0 都是未初始化的值(等于 boolean false),因此相等。

为了保护自己免受此类奇怪的错误的影响,最好始终使用 === 运算符。

0 和 '' 不是未初始化的值。它们是在比较时隐式类型转换为相同值的值。
2021-04-22 13:59:20

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

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

这是错误的 - '' 将被转换为 0,而不是布尔值 false
2021-04-26 13:59:20
我不认为这个解释是准确的。0 和 '' 在比较之前都不会转换为 false。参见 RoBorg 的回答 [ stackoverflow.com/questions/462663/...
2021-05-03 13:59:20
+1 非常好 - 您知道引擎如何决定要转换为哪种数据类型吗?显然,将 0 转换为字符串不会有相同的结果。
2021-05-05 13:59:20
不,我不确定。我怀疑它是数字类型或布尔类型转换。
2021-05-19 13:59:20
检查我的答案 - 我查了一下,标准说字符串将被转换为数字!
2021-05-19 13:59:20