JS类型强制如何工作?

时间:2014-12-17 10:46:32

标签: javascript equality coercion

我正在了解=====的对比,并且遇到了这个answer,这对理解这个概念很有帮助。但是我想知道其中一个例子:

'0' == false     // true

这可能有意义,因为==不检查类型。但后来我在控制台中尝试了一些可能的强制措施,并发现了以下内容:

Boolean('0')     // true
String(false)    // "false"

我原以为'0' == false'0' === String(false)具有相同的真值,但情况似乎并非如此。

那么强制如何实际起作用呢?我缺少一种更基本的类型吗?

2 个答案:

答案 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规范链接部分的相关部分:

  1. x = '0' y = false
  2. 检查 y 的类型是否为布尔值。
  3. 如果为true,请将 y 转换为数字。
  4. x y 的等效数字进行比较。
  5. 在我们的例子中,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