Почему {} + [] возвращает 0 в Javascript?
Возможный дубликат:
Какое объяснение этих причудливых действий JavaScript, упомянутых в разговоре "Wat" для CodeMash 2012?
Я знаю, что когда []
принуждается к строке, он возвращает пустую строку (""
), а когда {}
принуждается к строке, она возвращает "[object Object]"
.
Когда я запускаю [] + {}
в консоли браузера Javascript, он возвращается, как я ожидал:
>> [] + {}
"[object Object]"
Но когда я запускаю {} + []
, он возвращает совершенно неожиданное значение:
>> {} + []
0
Что может заставить его вернуть 0
?
Ответы
Ответ 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
Пустой блок принуждается к нулю. Затем оператор +
решает принудить []
к числу.