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

Присвоение переменной `{} + []` переменной

>> {} + []
0

Итак, EmptyObject + EmptyArray оценивается как 0. (Отказ от ответственности: я не совсем понимаю, почему это так.) Хорошо, теперь я хочу присвоить этому 0 переменной! Кажется довольно легким:

>> var a = {} + [];
undefined
>> a
"[object Object]"

Ну, может быть, не так просто. Гуглс немного... Ага! {} в этом контексте на самом деле является блоком кода, а не пустым. Поэтому lemme делает его больше похожим на кодовый блок:

>> var a = 
   {

   }
   + [];
undefined
>> a
"[object Object]"

... Данг. Примечание для себя: JavaScript игнорирует пробелы.


Можно ли каким-либо образом присвоить переменную {} + [] (или аналогичную), но все равно, чтобы {} + [] оценил значение 0?

4b9b3361

Ответ 1

Нет, нельзя назначить этот точный код переменной и заставить ее работать до 0, потому что синтаксический анализ этого кода, который дает 0, не является выражением †, и могут быть назначены только выражения. Причина, по которой вы получаете это 0, состоит в том, что фигурные скобки по существу игнорируются как пустой оператор, а затем вы получаете результат выражения + [] (т.е. Оператор унарного +, применяемый к пустому массиву). Поэтому для того, чтобы получить тот же результат, вам нужно будет изменить выражение так, чтобы оно просто сработало до +[]. Например, вы можете сделать var a = ({}, + []), и это даст вам правильный ответ (потому что запятая вызывает + [] для оценки отдельно).

† Это также причина, по которой он дает другой ответ, когда вы пытаетесь его назначить. Это заставляет код анализироваться как выражение, поэтому {} больше не является пустым блоком, а + уже не является унарным +, но вместо этого он представляет собой двоичный плюс с пустым объектом и пустой массив в качестве операндов.

Ответ 2

Try:

var a = eval("{} + []");

console.log(a); // returns (integer) 0

Хотя метод eval не рекомендуется использовать