JavaScript中的强制类型转换

15

我想了解一些关于强制类型转换的内容。

当你执行以下操作时:

1 == true // true

哪个被强制转换成哪个?是左边的还是右边的?

当你执行

undefined == null // true

它究竟是如何工作的? 它按照哪个顺序尝试进行转换? 例如:

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

它首先试图强制转换左侧操作数吗?然后是右边?还是两个都强制转换?

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


4
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using - VLAZ
5
@adiga 这绝对不是重复的问题。虽然这两个问题都涉及类型强制转换,但这个问题询问哪个操作数被强制转换为另一个操作数。另一个问题则是关于在评估强制转换类型时真相来源的问题。 - molamk
2
@adiga 不是重复。标记链接正在检查相等性,而此帖子正在询问相等性的过程。这就像Why 1 == true is trueHow 1 == true is true之间的区别。 - Rajesh
2
@Rajesh 这是一个可能的重复问题。它们是相关的。对于未来的用户(和OP)来说,这很有用,他们可能想阅读链接的问题。 - adiga
2
@adiga:重复问题是“重复的问题”,而不是“具有相似答案的相关问题”。因此,它绝对不是重复的。 - Eric Duminil
显示剩余3条评论
1个回答

30
该过程在 7.2.12 抽象相等比较 中有描述: 因此,解释器不是强制执行一侧然后执行另一侧,而是按照上面的列表顺序进行匹配,直到找到匹配条件并执行结果命令。这可能涉及仅对左侧或右侧进行强制转换(很少情况下会出现两者都需要强制转换的递归命令,例如true == '1',将满足第8个条件,变成1 == '1',满足第6个条件并变成1 == 1,满足第3个条件并解析为true)。

1
@SalmanA 我可能读错了,但在8中它不是两者都可以吗?这个算法会调用自身,对吧? - Kaiido
@Kaiido 在第8行,y 不会被强制转换。同样的,在第9行(其中x也不会被强制转换)。 - Salman A
@SalmanA 目前还没有,但在下一次出现 ToNumber(x) == y 的比较中可能会出现这种情况。 - Kaiido
2
@SalmanA 8会递归地调用==过程,所以我相信这是可能的。考虑 true == '1' - CertainPerformance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接