在JavaScript中,使用“!= ''”与空字符串进行比较有什么问题?
在JavaScript中,使用“!= ''”与空字符串进行比较有什么问题?
jsbin开始警告我x != \'\'
不好,应该使用x !== \'\'
替换它。
为什么?
admin 更改状态以发布 2023年5月23日
var x = false; console.log(x !== ''); //true console.log(x != ''); //false
换句话说,false
(和其他假值,如 0
)将被强制转换为空字符串。 !==
和 ===
运算符(严格相等运算符)确保被比较的东西是相同类型的。
为了进一步解释为什么会这样,您需要查阅规范(在 T.J. Crowder 的评论中链接)。关于 “抽象相等比较算法” 的部分告诉我们以下内容:
If Type(x) is Boolean, return the result of the comparison ToNumber(x)
== y.
关于 ToNumber
部分告诉我们:
如果参数是 true,则结果为 1。如果参数是 false,则结果为 +0。
在上面的示例中,参数为 false
,因此我们现在在比较 +0!= ''
。当比较数字和字符串时,遵循以下规则:
If Type(x) is Number and Type(y) is String, return the result of the
comparison x == ToNumber(y).
在空字符串上调用ToNumber
的结果为 +0
,就像对于 false
一样:
一个空的或只包含空格的 StringNumericLiteral 会被转换为 +0。
现在,我们正在比较 +0!= +0
,因此我们进入了 "x 和 y 是相同类型" 部分,这告诉我们:
如果 x 是与 y 相同的 Number 值,则返回 true。
因此,+0
等于 +0
,由于我们正在使用 !=
,因此返回 false
。