Подтвердить что ты не робот

Почему {} + [] возвращает 0 в Javascript?

Возможный дубликат:
Какое объяснение этих причудливых действий JavaScript, упомянутых в разговоре "Wat" для CodeMash 2012?

Я знаю, что когда [] принуждается к строке, он возвращает пустую строку (""), а когда {} принуждается к строке, она возвращает "[object Object]".

Когда я запускаю [] + {} в консоли браузера Javascript, он возвращается, как я ожидал:

>> [] + {}
"[object Object]"

Но когда я запускаю {} + [], он возвращает совершенно неожиданное значение:

>> {} + []
0

Что может заставить его вернуть 0?

4b9b3361

Ответ 1

Когда в начале инструкции есть {, он будет интерпретироваться как блок, который может содержать ноль или более операторов. Блок, в котором нет инструкций, будет иметь пустое значение продолжения.

Другими словами, в этом случае {} интерпретируется как пустой блок кода.

Оператор заканчивается после конечной скобки }, что означает, что следующие три символа +[] содержат собственную инструкцию.

В начале выражения или оператора + является оператором унарного плюса, который принуждает его операнд к числу.

Итак, +[] совпадает с Number([]), который оценивается как 0.

Короче говоря, {} + [] - это пустой блок кода, за которым следует массив, принуждаемый к числу.


Все сказанное, если вы оцениваете {} + [] внутри выражения, оно вернет то, что вы ожидаете:

>> ({} + []) 
"[object Object]" 

Еще одна интересная вещь: вы не можете начать утверждение с литерала объекта, потому что интерпретатор попытается разобрать его как оператор. Выполнение этого

{ "object": "literal" };

выдает синтаксическую ошибку.

Ответ 2

Потому что {} рассматривается как блок. Таким образом, ваше утверждение действительно:

{

//empty block here
}

+[] //0 same as Number([])

Вот почему это недопустимый javascript:

eval('{hello: "world", key: "value"}') //Syntax error

Вы можете добавить(), чтобы сделать его выражением (блоки не могут использоваться в выражении, так что это будет инициализатор объекта:

eval('({hello: "world", key: "value"})') //Object

Ответ 3

Пустой блок принуждается к нулю. Затем оператор + решает принудить [] к числу.