2015-07-31 2 views
8

Просто попытался это в консоли моего браузера:Почему это так: 0 ложно, а {} + [] равно 0, но !! ({} + []) истинно?

!!0 //=> false 
{} + [] //=> 0 
!!({} + []) //=> true 

Что здесь происходит !?

Edit: Я говорю о {} + [](объект первого), который отличается от [] + {}(массив первого), последний всегда возвращает 0. Разнос ({}+[] против {} + []), кажется, не имеет значения

+13

добро пожаловать на javascript! – Fallenreaper

+1

Что-то связанное с данными? –

+0

или попробуйте '[] + []' и '{} + {}' – AmmarCSE

ответ

6

Doing ({} + []) производит строку [object Object], которая когда принуждают булево является истинным значением.

Почему он рассматривает это как конкатенацию строк, когда они заключены в круглые скобки и число, когда оно не завернуто, я пытаюсь выяснить.

Обновление: Я думаю, что понял. Этот трюк происходит, когда код на глобальном уровне, т. Е. Не как назначение или как аргумент. Что, вероятно, происходит, это интерпретация {} как блока, а не объекта.

Если вы наберете { var x = 4; } +[] в свою консоль, вы получите тот же результат, что и {}+[]. Где, как если бы вы разместили его внутри набора круглых скобок, он заставляет компилятор интерпретировать интерьер как выражение, то есть Object плюс Array, который создает строку.

Мое предположение заключается в том, что это изменение частично связано с изменением объема обработки за счет let.

+0

Удивительный! Мы на полпути. Я обнаружил, что '{} + {}' не совпадает с '({} + {})', но '[] + []' и '([] + [])' одинаковы. – Shelvacu

+1

Re: Edit: '{foo:" bar "} + []' все равно возвращает 0. Но ждите, 'eval ('foo:" bar "')' is valid (?????), поэтому, я думаю, вы Верно. Я предполагаю, что единственный способ заставить объект быть простым объектом - заключить его в круглые скобки (или назначить его или использовать в сравнении или что бы я ни думал) – Shelvacu

+0

@Shel Причина 'foo:" bar "' является законным, потому что вы создаете ярлык под названием 'foo', который вы можете перейти к использованию' break' или 'continue'. [Вот пример] (http://jsfiddle.net/dxvL34xw/). –

-2

Это неправильно, {} + [] не 0:

alert({} + []);

Update: не коммутативной поведение (Node оболочки):

// as expected 
{} + [] // '[object Object]' 
[] + {} // '[object Object]' 

// however 
eval("{} + []") // 0 
eval("[] + {}") // '[object Object]' 
+3

Откройте консоль и просто введите '{} + []' –

+0

'node -e 'console.log ({} + [])'' // return [object Object] – Vidul

+0

Опять вы вызываете его в функции , Полностью удалить функцию. –

1
{} + [] // 0 
!!0 // false 

({} + []) // [object Object] 
!!({} + []) // true 

eval("{} + []") // 0 
!!eval("{} + []") // false 

Ничего страшного! Но есть одна действительно странная вещь: если вы положили ({}+[]) === {}+[], ответ true, и если вы положите {}+[] === ({}+[]), ответ будет false, wtf.

+0

присвоение переменной ('a = {} + []') также сделает ее объектом, как будет (по-видимому) оператором '==='. '({} + []) === eval (" {} + [] ")' дает ожидаемый 'false' – Shelvacu

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