我正在了解==
与===
的对比,并且遇到了这个answer,这对理解这个概念很有帮助。但是我想知道其中一个例子:
'0' == false // true
这可能有意义,因为==
不检查类型。但后来我在控制台中尝试了一些可能的强制措施,并发现了以下内容:
Boolean('0') // true
String(false) // "false"
我原以为'0' == false
与'0' === String(false)
具有相同的真值,但情况似乎并非如此。
那么强制如何实际起作用呢?我缺少一种更基本的类型吗?
答案 0 :(得分:3)
"0"
是一个包含字符 0 的字符串,不数字值0
。唯一一个评估为false
的字符串类型值为""
。
"0"
是truthy。
Section 9.2 of the ECMAScript 262 specification定义了不同类型如何转换为布尔值:
Argument Type Result
Undefined false
Null false
Boolean The result equals the input argument (no conversion).
Number The result is false if the argument is +0, −0, or NaN; otherwise the
result is true.
String The result is false if the argument is the empty String (its length is
zero); otherwise the result is true.
Object true
然而,只有在使用===
进行比较时才会严格遵循。
使用Boolean('0')
时,您将值'0'
转换为布尔值(与使用!!'0'
相同)。将'0'
与false
进行松散比较时,布尔值将转换为数字(定义为here)。转换为数字时,false
变为0
。这意味着最终计算为'0' == 0
,相当于true
。
总结上述ECMAScript规范链接部分的相关部分:
'0'
和 y = false
。在我们的例子中,JavaScript的实现将是:
var x = '0', // x = "0"
y = false; // y = false
if (typeof y === "boolean") {
y = +y; // y = 0
}
console.log( x == y ); // "0" == 0
-> true
答案 1 :(得分:0)
让编程世界的全新事物变得更加混乱:
Boolean('false')
true
Boolean('true')
true
我认为出于某种原因使用!!
运算符更容易,更直观。我不知道我是否有道理,但我从未使用Boolean()
回答这个问题,我发现该主题很有用:Difference between == and === in JavaScript