【问题标题】:How does JS type coercion work?JS 类型强制是如何工作的?
【发布时间】:2015-02-15 21:26:49
【问题描述】:

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

'0' == false     // true

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

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

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

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

【问题讨论】:

  • String(false) 正在返回 false 的字符串表示,而 Boolean('0') 正在将字符串 '0' 转换为 true(因为非空字符串是真实的)
  • 您可以在此处找到所有问题的答案:ecma-international.org/ecma-262/5.1 一开始有点难读,但如果您花一些时间阅读,您会受益匪浅。

标签: javascript equality coercion


【解决方案1】:

"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. 如果为真,则将 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怎么可能是真的?
  • 谢谢@james-donnelly!该链接正是我正在寻找的,但不知道它:)
  • @LucyBain 我对我的答案添加了一些更新,希望能让一切变得清晰。 ECMAScript 规范的关键部分是ecma-international.org/ecma-262/5.1/#sec-11.9.3,特别是第 6 点和第 7 点。
【解决方案2】:

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

Boolean('false')
true

Boolean('true')
true

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

回答这个问题,我发现这个帖子很有用:Difference between == and === in JavaScript

【讨论】:

  • 这个 SO 问题是我的例子,但我不知道它是如何工作的。我现在会坚持=== :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多