JS 类型强制是如何工作的?

IT技术 javascript equality coercion
2021-02-27 21:19:08

我正在学习==vs.===并遇到了这个答案,这对理解这个概念非常有帮助。但是,我想知道以下示例之一:

'0' == false     // true

这可能是有道理的,因为==不检查类型。但后来我在控制台中尝试了一些可能的强制转换,发现以下内容:

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

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

那么强制实际上是如何工作的呢?有没有我缺少的更基本的类型?

2个回答

"0"是包含字符0的字符串,它不是数值0计算结果的唯一字符串类型值false""

"0"真实的

ECMAScript 262 规范的第 9.2 节定义了不同类型如何转换为布尔值:

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

但是,只有在比较 using 时才严格遵循这一点===

使用时,Boolean('0')您将值转换'0'为布尔值(与使用相同!!'0')。'0'与 进行松散比较false,布尔值被转换为一个数字(定义在这里)。false,当转换为数字时,变为0这意味着最终的计算'0' == 0等于true

总结上面 ECMAScript 规范链接部分的相关部分:

  1. x ='0'y = false
  2. 检查y的类型是否为布尔值。
  3. 如果为 true,则将y转换为数字。
  4. xy的数字等价物进行比较

在我们的例子中,它的 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
对不起,我还是一头雾水。如果“0”是真的,那怎么可能'0' == false是真的?
2021-04-25 21:19:08
@LucyBain 我在我的答案中添加了一些更新,希望能让一切都清楚。ECMAScript 规范的关键部分是ecma-international.org/ecma-262/5.1/#sec-11.9.3,特别6 点和第 7 点。
2021-04-29 21:19:08
@LucyBain 工作缓慢,所以我还添加了一个 JavaScript 方法,用于说明如何应用 ECMAScript 的定义,即如何使用==.
2021-05-01 21:19:08
谢谢@james-donnelly!该链接正是我要找的,但不知道:)
2021-05-06 21:19:08
2021-05-15 21:19:08

为了让编程世界中的全新事物更加混乱:

Boolean('false')
true

Boolean('true')
true

我认为!!出于某种原因使用运算符更容易和更直观我不知道我是否有意义,但我从未使用过Boolean()

在回答这个问题时,我发现该线程很有用:Difference between == and === in JavaScript

那个 SO 问题是我从哪里得到我的例子,但我无法弄清楚它是如何工作的。我会暂时坚持===:)
2021-04-19 21:19:08