我想知道有关胁迫的一些事情。
当您这样做:
1 == true // true
哪个被强迫进入哪一个?是左一个还是右一个?
完成时
undefined == null // true
它是如何工作的? 它尝试以哪种顺序转换它? 实例:
1) String(undefined) == String(null) // false
2) Number(undefined) == Number(null) // false
3) Boolean(undefined) == Boolean(null) // true
它首先尝试强制转换左侧操作数吗?那对吗?然后都是吗?
编辑: 如评论中所述: “不是重复的。尽管两个问题都涉及类型强制,但这个问题询问哪个操作数被强制转换为另一个。另一个问题是有关评估强制类型时的真相来源”
答案 0 :(得分:27)
该过程在7.2.12 Abstract Equality Comparison中进行了描述:
比较x == y(其中x和y是值)会产生true或false。这样的比较执行如下:
如果Type(x)与Type(y)相同,则返回执行严格相等比较x === y的结果。
如果x为空且y未定义,则返回true。
如果x未定义且y为空,则返回true。
如果Type(x)为Number而Type(y)为String,则返回比较结果x == ToNumber(y)。
如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。
如果Type(x)为布尔型,则返回比较结果ToNumber(x)== y。
如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。
如果Type(x)是字符串,数字或符号,而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
如果Type(x)是Object并且Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
返回false。
因此,与其说先不强迫一侧然后再强迫另一侧,不如说,解释器要遍历上面的列表,直到找到匹配的条件,然后执行结果命令,这可能只涉及强迫左侧,或仅在右侧(很少,在到达递归命令的情况下,例如true == '1'
这样,它将满足条件8,变成1 == '1'
,满足条件6并变成1 == 1
,满足条件3并解决为true
)