console.log(...)和REPL模式下的不同输出

时间:2016-09-28 01:36:40

标签: javascript node.js read-eval-print-loop console.log

在阅读有关JavaScript强制的内容时,我遇到了这个问题。

[] + {}; // [object Object]
{} + []; // 0

我理解这是如何工作的,但我无法理解为什么" console.log"将上述两个语句在REPL中执行并导致两个不同的事情。

以REPL模式运行时

enter image description here

When ran in browser(Chrome, Firefox) 
console.log([] + {}); // '[object Object]'
console.log({} + []); // '[object Object]'

我最初的想法是在console.log参数上调用toString,但绝对不是这样。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

语句{} + []对JavaScript引擎不明确;虽然 human 会将其读作“添加空对象和空数组”,但JavaScript引擎会将其解析为:

// {} + []
{};   // empty block statement with implicit semicolon
+ []; // empty array, coerced into the number 0
// = 0

当括在括号中时,例如在函数内部,这种解释是无效的,因此引擎会回退到将其解释为添加对象(强制转换为字符串'[Object]')和空数组(强制转换)成为字符串''