2016-09-28 2 views
0

При чтении немного о принуждении JavaScript я пришел через это.Различные выходы в console.log (...) и в режиме REPL

[] + {}; // [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]' 

Моя первая мысль была, возможно, toString называют по параметрам console.log, но это определенно не так. Есть идеи?

ответ

1

Заявление {} + [] неоднозначно для механизма JavaScript; в то время как люди бы прочитать как «добавление пустого объекта и пустой массив», двигатель JavaScript, разбирает это как:

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

Когда обернутые в скобках, например, внутри функции, эта интерпретация является недействительным , поэтому двигатель возвращается к интерпретации его как добавление объекта (принудительно в строку '[Object]') и пустой массив (принудительно в строку '')

Смежные вопросы