2015-10-02 4 views
0

У меня очень простой вопрос. Теперь в консоли я тренируюсь некоторые "арифметику", как:Пустой объект минус/плюс пустой объект и обратное значение

false + true // 1 

Таким образом, возникает вопрос, почему:

[] - {} // NaN 

и

{} - [] // -0 

Может кто-нибудь объяснить это, потому что оба эти типа являются объектами. И я знаю, что javascript имеет действительно и фальшивые ценности. Таким образом, если мы возьмем

Boolean({}) // true 
Boolean([]) // true 

в обоих мы имеем true, и я думаю, что результат будет как:

true + true // 2 

или

true - true // 0 
+0

'{} - []' 'должны быть NaN'. –

+0

@SpencerWieczorek почему? Я думаю, что это должно быть 1 – AleshaOleg

+0

Потому что '+ {}' является 'NaN'. Когда я делаю 'console.log ({} - [])' результат - это 'NaN', по крайней мере, в Chrome. –

ответ

2

В этом контексте (в консоли), {} - пустой блок, который ничего не делает, поэтому результат будет таким же, как

- [] 

И [] будет принуждать к 0, как это видно по:

+[] 

Если вы хотите {} следует рассматривать как пустой объект, попробуйте следующее:

({}) - [] 

Вы получите NaN прямо сейчас , поскольку пустой объект не принуждает к числу.

Обновление: Это также будет работать, как следует ожидать, в консоли (возвращающегося NaN):

({} - []) 
+0

Особое безумие здесь, почему '+ []' принуждает к '0'. Ответ кажется [здесь] (http://www.ecma-international.org/ecma-262/5.1/#sec-8.12.8) - если 'Obj.valueOf()' не возвращает примитив, то 'Obj.toString()' вызывается и *, что * является основой для числового преобразования. '[] .toString() ===" "и' + "" === 0'. Кроме того, это причудливо означает, что '+ [[[3.2.2]]] === 3.2'. Смешной. – nrabinowitz

+0

@nrabinowitz Как бы вы преобразовали массив в число, иначе? Я думаю, что объединение массива является наиболее разумным способом преобразования его в примитив, а затем унарный '+' преобразует строку в число. – Oriol

+0

@ Ориол - ну, я бы пошел прямо на «NaN». Но IANALD (я не разработчик языка). – nrabinowitz

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