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

4

我正在学习=====之间的区别,并发现了这个答案,它帮助我更好地理解了这个概念。然而,我对其中一个示例感到困惑:

'0' == false     // true

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

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

我本以为 '0' == false 的真值与 '0' === String(false) 相同,但事实并非如此。
那么这个强制转换实际上是如何工作的呢?我是否缺少更基本的类型?

String(false) 返回 false 的字符串表示形式,而 Boolean('0') 将字符串 '0' 转换为 true(因为非空字符串为真值)。 - atmd
1
你可以在这里找到所有问题的答案:http://www.ecma-international.org/ecma-262/5.1/。一开始可能有点难读,但如果你花些时间仔细阅读,你将受益匪浅。 - dfsq
一些关于 == 的可能令人惊讶的例子。 - ToolmakerSteve
2个回答

3
""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

然而,只有在使用 === 时才严格遵循这一点。

当使用 Boolean('0') 时,您正在将值 '0' 转换为布尔值(与使用 !!'0' 相同)。 当使用宽松比较符号将 '0'false 进行比较时,布尔值会被转换为数字(如此处所定义)。 当转换为数字时,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 是正确的呢? - Lucy Bain
1
请参考此答案:https://dev59.com/s2sz5IYBdhLWcg3w3bpb - James Donnelly
谢谢@james-donnelly!那个链接正是我正在寻找的,但我不知道 :) - Lucy Bain
@LucyBain 我对我的回答进行了一点更新,希望能让一切变得清晰明了。ECMAScript 规范的关键部分在于 http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 ,尤其是第6和第7点。 - James Donnelly
@LucyBain 工作比较闲,所以我还添加了一个 JavaScript 方法,用于应用 ECMAScript 的定义来使用 == 进行比较。 - James Donnelly
非常感谢,更新后清晰明了了!规格说明确实很有帮助 - 我原以为它从第一个操作数中获取类型。今日我受教了 :) - Lucy Bain

0

对于完全新手来说,让事情更加混乱的是编程世界:

Boolean('false')
true

Boolean('true')
true

我认为出于某种原因,使用!!运算符更容易和更直观。我不知道自己是否讲得通,但我从未使用过Boolean()

回答这个问题,我发现这个帖子很有用:JavaScript中==和===的区别


那个SO问题是我得到示例的地方,但我无法弄清楚它是如何工作的。我现在会坚持使用=== :) - Lucy Bain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接