在阅读有关JavaScript强制的内容时,我遇到了这个问题。
[] + {}; // [object Object]
{} + []; // 0
我理解这是如何工作的,但我无法理解为什么" console.log"将上述两个语句在REPL中执行并导致两个不同的事情。
以REPL模式运行时
When ran in browser(Chrome, Firefox)
console.log([] + {}); // '[object Object]'
console.log({} + []); // '[object Object]'
我最初的想法是在console.log参数上调用toString
,但绝对不是这样。有什么想法吗?
答案 0 :(得分:1)
语句{} + []
对JavaScript引擎不明确;虽然 human 会将其读作“添加空对象和空数组”,但JavaScript引擎会将其解析为:
// {} + []
{}; // empty block statement with implicit semicolon
+ []; // empty array, coerced into the number 0
// = 0
当括在括号中时,例如在函数内部,这种解释是无效的,因此引擎会回退到将其解释为添加对象(强制转换为字符串'[Object]'
)和空数组(强制转换)成为字符串''
)