【问题标题】:Coercion in JavaScript [duplicate]JavaScript中的强制[重复]
【发布时间】:2020-06-22 01:22:44
【问题描述】:

我想知道一些关于强制的事情。

当你这样做时:

1 == true // true

哪个被强制进入哪个?是左边还是右边?

当你这样做时

undefined == null // true

它是如何工作的? 它尝试按什么顺序转换它? 按实例:

1)    String(undefined) == String(null) // false
2)    Number(undefined) == Number(null) // false
3)    Boolean(undefined) == Boolean(null) // true

它是否首先尝试强制左侧操作数?那么对吗?然后两个?

编辑: 如 cmets 中所述: “不是重复的。虽然这两个问题都是关于类型强制的,但这个问题会询问哪个操作数被强制转换为另一个。另一个问题是评估强制类型时的真实来源”

【问题讨论】:

  • @adiga 绝对不是重复的。虽然这两个问题都是关于类型强制的,但这个问题询问哪个操作数被强制转换为另一个。另一个是关于评估强制类型时的真相来源
  • @adiga 这不是骗子。标记的链接正在检查平等,这篇文章正在询问平等的过程。就像 Why 1 == true is true vs How 1 == true is true
  • @Rajesh 这是一个可能重复。它们是相关的。未来的用户(和 OP)会遇到这个问题并可能想要阅读链接的问题。
  • @adiga:重复是“重复的问题”,而不是“具有相似答案的相关问题”。所以绝对不是重复的。

标签: javascript coercion


【解决方案1】:

流程描述在7.2.12 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。

  6. 如果 Type(x) 是 Boolean,则返回比较结果 ToNumber(x) == y。

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

  8. 如果 Type(x) 是 String、Number 或 Symbol 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。

  9. 如果 Type(x) 是 Object 并且 Type(y) 是 String、Number 或 Symbol,则返回比较结果 ToPrimitive(x) == y。

  10. 返回 false。

因此,与其强制一侧然后另一侧,或类似的东西,解释器更多的是遍历上面的列表,直到找到匹配条件,并执行结果命令,这可能只涉及强制左侧, 或仅右侧(并且,很少,两者都有,如果到达递归命令,例如true == '1',它将满足条件8,变成1 == '1',满足条件6并变成1 == 1,满足条件 3 并解析为true)

【讨论】:

  • @SalmanA 我可能读错了,但在 8 中不能两者兼而有之吗?这个算法自称对吗?
  • @Kaiido in 8, y 不是强制的。同样在 9 中(其中 x 不是强制的)。
  • @SalmanA 还没有,但在下一次出现the comparison ToNumber(x) == y. 时可能不会?。
  • @SalmanA 8 递归调用== 进程,所以我很确定这可能吗?考虑true == '1'
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 2012-06-13
  • 2014-04-18
  • 2020-04-19
  • 2021-08-24
  • 2011-05-27
  • 2011-03-31
相关资源
最近更新 更多