2015-06-23 2 views
4

Я нашел интересный вопрос JavaScript в Интернете. Это было то, что +!{}[0] равно?JavaScript - Почему +! {} [0] == 1?

Ответ действительно удивил меня и оказался 1.

Теперь я пытаюсь понять, почему этот синтаксис приведет к этому.

Вот почему я попытался разбить его

!{} возвращает false

false[0] возвращает undefined

+false[0] возвращает NaN

Так что я не могу понять, почему это выше выражение будет возвращать 1 Любые теории?

+0

Связанный: * Почему ++ [[ ]] [+ []] + [+ []] = "10" * http://stackoverflow.com/q/7202157/205233 – Filburt

+2

Несмотря на то, что я не думаю, что эти вопросы действительно ценны для переполнения стека, Я рад, что вы потратили некоторое время, чтобы понять это самостоятельно. –

ответ

9

У вас есть приоритет операторов не так (MDN). Это:

{}[0] возвращает undefined

!undefined возвращает true

+true возвращает 1

+0

Ницца! Спасибо, что указали, что вне этого –

+0

@basilikum. Пока я проверяю консоль (chrome или FF) для '{} [0]' возвращает '[0]' вместо 'undefined'. Зачем? , Также, что это значит в пользу '! [0]'. – Rajkishore

+0

@RJ это должно быть особое поведение консоли. Я не могу сказать вам, почему это происходит в хроме, но если вы пишете «var a = {} [0];», а затем просто запишите 'a', он показывает правильное значение (' undefined'). Поэтому я предполагаю, что в этом случае Chrome видит '{}' и '[0]' как два независимых оператора и просто печатает результат второго. То же самое происходит, если вы напишете '{}« привет »', который будет печатать 'hello'. Но в любом случае '{} [0]' определенно является 'undefined'. – basilikum

0

Я не думаю, что вы можете сломать это вверх, как вы делали, так как Javascript имеет свои собственные правила, довольно как и всякая логическая система Первое, что срабатывало, я думаю, будет {}. Это создает нейтральный объект. На следующем шаге должно выполняться [0], поэтому он принимает первый «элемент» объекта, который будет обрабатываться как массив emtpy. Это будет приписываться False и что вы инвертируете с помощью «!». Поскольку + ожидает целое число, а true - не число, оно будет обрабатываться как ноль, и в этом случае увеличивается на «+», поэтому конечный результат равен 1.

+0

Я знаю, это меня просто задержало. –

+0

* ", поэтому он берет первый« элемент »объекта, который может быть обработан как массив emtpy.» * Нет. Это просто пытается прочитать свойство «0» от объекта. Он не имеет ничего общего с массивами. –

+0

Конечно, ты прав. В любом случае, поскольку нет свойства 0, он будет преобразован в false (поскольку неопределенный как boolean в js считается ложным). – xanobius

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