为啥 JavaScript 中的 "0" == "" 为假
Posted
技术标签:
【中文标题】为啥 JavaScript 中的 "0" == "" 为假【英文标题】:Why is "0" == “” false in JavaScript为什么 JavaScript 中的 "0" == "" 为假 【发布时间】:2021-06-30 05:20:14 【问题描述】:在 ES5 规范中,第 11.9.3.4-5 条说:
如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回 比较 x == ToNumber(y)。 如果 Type(x) 是 String 并且 Type(y) 是 Number,返回比较结果 ToNumber(x) == y。
我的理解是: "" 被强制为数字,变成 0 -> "0"==0 然后递归地将“0”强制为数字并变为0 -> 0==0 所以输出必须是true。 但它是错误。 你能解释一下为什么吗?
console.log("0"=="")
【问题讨论】:
【参考方案1】:"0"
是一个字符串。 ""
也是如此。不涉及类型强制。
0
(单个字符,字符码48)组成的字符串不等价于空字符串。
如果 '0'
改为 0
,则该过程将按照您的描述发生:
console.log(0 == "")
空字符串变成一个数字 - 0 - 然后0 === 0
计算为true
.-
(但我建议永远不要使用草率的相等 - 始终使用严格的相等,您不必担心任何这些愚蠢)
【讨论】:
啊,关于强制的阅读太多了,这停止了思考:D 无论如何,感谢您的回答,节省了我的时间。【参考方案2】:7.12.4 Abstract Equality Comparison 中的第一个子句是:
如果 Type(x) 与 Type(y) 相同,则 一种。返回执行严格等式比较 x === y 的结果。
7.12.5 Strict Equality Comparison 全文阅读:
如果 Type(x) 与 Type(y) 不同,则返回 false。 如果 Type(x) 是 Number 或 BigInt,则 一种。返回 !类型(x)::equal(x, y)。 返回! SameValueNonNumeric(x, y)。
由于"0"
和""
的类型都是String,case#1和case#2都不适用,所以我们去7.2.12 SameValueNonNumeric(x, y):
断言:Type(x) 不是 Number 或 BigInt。 断言:Type(x) 与 Type(y) 相同。 如果 Type(x) 未定义,则返回 true。 如果 Type(x) 为 Null,则返回 true。 如果 Type(x) 是字符串,那么。 一种。如果 x 和 y 是完全相同的代码单元序列(相同的长度和对应索引处的相同代码单元),则返回 true;否则,返回 false。 如果 Type(x) 是布尔值,那么 一种。如果 x 和 y 都为真或都为假,则返回真;否则,返回 false。 如果 Type(x) 是 Symbol,那么 一种。如果 x 和 y 都是相同的 Symbol 值,则返回 true;否则,返回 false。 如果 x 和 y 是相同的 Object 值,则返回 true。否则,返回 false。
应该很容易看出案例 #5 在这里适用:
如果 Type(x) 是字符串,那么。 一种。如果 x 和 y 是完全相同的代码单元序列(相同的长度和对应索引处的相同代码单元),则返回 true;否则,返回 false。
还应该很容易看出"0"
和""
不是完全相同的代码单元序列,因为它们在相应的索引处既没有相同的长度也没有相同的代码单元。
因此,结果为false
,根据 7.2.12 第 5 节 a 子条款的第二个备选方案。
【讨论】:
以上是关于为啥 JavaScript 中的 "0" == "" 为假的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中,为啥 "0" 等于 false,但是当通过 'if' 测试时,它本身不是 false?
为啥/如何将 `value="javascript:alert(1)"` 视为 OWASP 的 ZAP 工具中的 XSS 漏洞?
checkbox类型的input的checked值为true了,为啥没有打勾?(javascript)
有人能解释一下为啥“运算符优先级”适用于 javaScript 中的“||”、“&&”等逻辑运算符吗
为啥 1+ +"2"+3 在 JavaScript 中计算为 6? [复制]
为啥在Javascript里用window.location.href=‘a.html’语句不能实现网页跳转啊。浏览器还是显示原网页。