当[] == false时,类型强制如何发生?

Raj*_*amy 12 javascript

ECMA脚本文档抽象平等比较算法中说,

如果Type(y)是布尔值,则返回比较结果x == ToNumber(y).

所以,例如,[] == false将被胁迫,如,

1.   [] == Number(false)
2.   [] == 0 //comparison happens here.
Run Code Online (Sandbox Code Playgroud)

我的问题是,强制将以递归的方式发生,直到两个操作数变得原始或不变?强制如何发生在这里?

我假设强制将重复,直到将两个操作数转换为原语,如下所示

1.   [] == Number(false)
2.   [] == 0
3.   ToPrimitive([]) == 0
4.   0 == 0 
5.   true
Run Code Online (Sandbox Code Playgroud)

我的推定是真的吗?如果没有,谁能解释这里有什么问题?另外,如何ToPrimitive([])在任何浏览器的控制台中验证结果为0?

zan*_*ngw 5

参考spec,[] == false可以解析如下表格

ToNumber(ToPrimitive([])) == ToNumber(false)
Run Code Online (Sandbox Code Playgroud)

这里有更多细节

如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)

[] == ToNumber(false)
Run Code Online (Sandbox Code Playgroud)

如果Type(x)是Object而Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y

ToPrimitive([]) == 0
Run Code Online (Sandbox Code Playgroud)

根据ToPrimitive算法,valueOf首先调用.但是,因为它返回一个对象,而不是一个原始值,所以toString将再次调用它,它返回一个字符串'',空字符串

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

ToNumber('') == 0
Run Code Online (Sandbox Code Playgroud)

然后ToNumber到0.比较ToNumber(false)也是0.结果,它们是相同的.