【问题标题】:implicit coercion in javascriptjavascript中的隐式强制
【发布时间】:2019-08-07 12:23:21
【问题描述】:

我正在重新审视 javascript 中的隐式强制转换,并意识到我忽略了一些东西,需要对其进行澄清。

如果

var a = "5";
var b = 5;

a==b 将返回true

但是a==b 有两种可能的方式可以提供真正的强制,对吗?要么是5 == 5,要么是'5' == '5'。那么这里的上述示例实际上发生了哪一个?

【问题讨论】:

标签: javascript coercion type-coercion


【解决方案1】:

答案在规范中的Abstract Equality Comparison Algorithm,具体来说:

  1. 如果Type(x) 是String,Type(y) 是Number,返回比较结果! ToNumber(x) == y。

ToNumber(x) 之前的 ! 并不意味着否定,它是一种规范符号,断言 ToNumber(x) 永远不会导致突然终止。)

这是一个数值比较,"5"转换成5然后比较就完成了。

【讨论】:

  • 我可以知道在此处放置突然终止符号的目的是什么吗?一开始让我很困惑。
  • @tnkh - 已涵盖here“同样,前缀 ! 用于指示以下对抽象或语法指导的操作的调用将永远不会返回突然完成,并且应使用生成的完成记录的 [[Value]] 字段代替操作的返回值。” 请点击链接,了解在明确做出断言时! 需要的内容的长版本。 :-)
【解决方案2】:

基于抽象相等比较算法,操作数将首先尝试转换为数字。所以字符串'5'会被尝试转换成数字5

看看abstract equality algorithm.中的第6步和第7步不管数字是什么类型,数字的操作数都会被转换为数字。

【讨论】:

    【解决方案3】:

    这里有描述:

    2019 EcmaScript specifications - Abstract equality comparison

    比较 x == y,其中 x 和 y 是值,产生真或假。这样的比较是这样进行的:

    1) 如果 Type(x) 与 Type(y) 相同,则 返回执行严格等式比较的结果 x === y。

    2) 如果 x 为 null 且 y 未定义,则返回 true。

    3) 如果 x 未定义且 y 为 null,则返回 true。

    4) 如果 Type(x) 是 Number 并且 Type(y) 是 String,返回比较结果 x == ! ToNumber(y)。

    5) 如果Type(x)是String,Type(y)是Number,返回比较结果! ToNumber(x) == y。

    (...)

    所以字符串被转换为数字,然后进行比较。

    这可以通过以下代码证明:

    "" == 0 // true
    0 == "" // true
    

    两者都返回true,因为空字符串被强制为数字0。

    如果反过来,0 会变成“0”(因为 0 == “0” 也是如此)并且与空字符串的比较将返回 false

    【讨论】:

    • 只是 FWIW,这是一个相当古老的规范要链接到。那是ES2015。我们现在在 ES2019 上,但总的来说,我建议链接到 the living specification
    • @T.J.Crowder 好点,我在书签中使用我的硬链接,是时候更新了
    猜你喜欢
    • 2019-03-09
    • 2021-01-09
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多