【问题标题】:How to understand the expression "{} == true"?如何理解表达式“{} == true”?
【发布时间】:2015-12-30 08:43:18
【问题描述】:

我尝试理解{} == true 文档Ecma-2627.2.12 部分之后的表达式。

  1. 如果 Type(y) 为 Boolean,则返回比较结果x == ToNumber(y)

ToNumber(true)的结果是1,那么

{} == 1

  1. 如果 Type(x) 是 Object 并且 Type(y) 是字符串、数字或符号,则 返回比较结果ToPrimitive(x) == y

我现在对ToPrimitive({}) 感到困惑。

  1. 如果提示是“字符串”,那么

    一个。让 methodNames 为 «"toString", "valueOf"»。

  2. 否则,

    一个。让 methodNames 为 «"valueOf", "toString"»。

应该将ToPrimitive({}) 解释为{}.toString() 还是{}.valueOf()

假设调用了toString()

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

所以{} == true 可能是ToNumber(ToPrimitive({})) == ToNumber(true)

【问题讨论】:

  • methodNames 列表是优先级列表
  • 谁能提供更多细节”听起来太宽泛了。你想知道什么?
  • @Bergi 我从“Dmitri Pavlutin”的回答中得到了一些细节。你是对的,我会更新我的问题。
  • 提供的两个答案都是正确的,并且相辅相成。正如您所说的两个问题,Felix Kling 更好地回答:Should ToPrimitive({}) be interpreted as {}.toString() or {}.valueOf()?;和 Dmitri Pavlutin 更好的答案:So {} == true could be ToNumber(ToPrimitive({})) == ToNumber(true)?.

标签: javascript


【解决方案1】:

spec 说:

ToPrimitive 在没有提示的情况下被调用时,它通常表现得好像提示是数字一样。

因此,根据ToPrimitive 算法,首先调用valueOf。但由于返回的是一个对象,而不是原始值,toString 将被称为第二个,它返回一个字符串。

所以{} == true 可能是ToNumber(ToPrimitive({})) == ToNumber(true)

是的,就是这样。

【讨论】:

  • 能否提供更多关于ToNumber(ToPrimitive({})) == ToNumber(true)的详细信息?
  • 您到底想知道什么?我以为你知道函数在做什么?
  • 我从@Dmitri Pavlutin 的回答中得到了一些细节。
【解决方案2】:

ToPrimitive({}) 首先计算为{}.valueOf()。因为valueOf()返回对象本身,所以使用toString()方法。
{}.toString()返回"[object Object]",与1比较。 "[object Object]" 转换为数字 NaN 并与 1 进行比较。
现在操作数是相同类型的数字,并且使用了 === 运算符。 NaN === 1 计算结果为 false

正式地:

  1. {} == true(将true 转换为Number -> 1
  2. {} == 1(使用 valueOf() 转换 {},然后使用 toString() -> "[object Object]"
  3. "[object Object]" == 1(将"[object Object]" 转换为Number -> NaN
  4. NaN == 1(由于操作数类型相同,将操作符改为===
  5. NaN === 1
  6. false

更新:查看我的帖子The legend of JavaScript equality operator,了解更多详细信息和示例。

【讨论】:

  • 我在问题中提到的是==,而不是===,所以NaN === 1?
  • @zangw, NaN 在任何比较中都返回 false
  • @zangw 因为 == 首先将操作数转换为相同的类型,最后 === 完成(NaN 和 1 是相同的 Number 类型)。简单来说,在使用==的时候,最终转化为相同类型后,还是使用了===。
猜你喜欢
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多