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?
参考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.结果,它们是相同的.