JavaScript中的强制转换

时间:2019-02-07 06:30:49

标签: javascript coercion

我想知道有关胁迫的一些事情。

当您这样做:

1 == true // true

哪个被强迫进入哪一个?是左一个还是右一个?

完成时

undefined == null // true

它是如何工作的? 它尝试以哪种顺序转换它? 实例:

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

它首先尝试强制转换左侧操作数吗?那对吗?然后都是吗?

编辑: 如评论中所述: “不是重复的。尽管两个问题都涉及类型强制,但这个问题询问哪个操作数被强制转换为另一个。另一个问题是有关评估强制类型时的真相来源”

1 个答案:

答案 0 :(得分:27)

该过程在7.2.12 Abstract Equality Comparison中进行了描述:

  

比较x == y(其中x和y是值)会产生true或false。这样的比较执行如下:

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

  2.   
  3. 如果x为空且y未定义,则返回true。

  4.   
  5. 如果x未定义且y为空,则返回true。

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

  8.   
  9. 如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。

  10.   
  11. 如果Type(x)为布尔型,则返回比较结果ToNumber(x)== y。

  12.   
  13. 如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。

  14.   
  15. 如果Type(x)是字符串,数字或符号,而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。

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

  18.   
  19. 返回false。

  20.   

因此,与其说先不强迫一侧然后再强迫另一侧,不如说,解释器要遍历上面的列表,直到找到匹配的条件,然后执行结果命令,这可能只涉及强迫左侧,或仅在右侧(很少,在到达递归命令的情况下,例如true == '1'这样,它将满足条件8,变成1 == '1',满足条件6并变成1 == 1,满足条件3并解决为true