Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Wat - забавное видео про особенности js (https://javascript.ru/forum/offtopic/25816-wat-zabavnoe-video-pro-osobennosti-js.html)

Snipe 16.02.2012 11:34

Wat - забавное видео про особенности js
 
Думаю, многие уже видели (смотреть вторую половину):
https://www.destroyallsoftware.com/talks/wat

Мне показалось все знакомым и логичным, кроме сложения пустого объекта с пустым же массивом... Почему там 0?

П.с. Можно ли не брать на работу людей, которые не ответили на этот вопрос? =)

poorking 16.02.2012 11:49

Кстати что странно, так это то, что только в консоли такие результаты;

alert({} + []);

Причем если выполнить в коде
console.log({} + []);

то будет "[object Object]", а если набрать в консоли это выражение то будет Number 0.

Также для {} + {} я ожидал увидеть "[object Object][object Object]", но в консоли будет NaN, если набрать. Однако если выполнить в коде
console.log({} + {})

то будет ожидаемое

Snipe 16.02.2012 11:51

Если просто в коносли набрать, будет как на видео (способ ввода и результат связаны - это типа подсказка)...
Я уже нашел ответ в интернетах. Но публиковать пока не буду. ;)

vasa_c 16.02.2012 12:11

Цитата:

Сообщение от Snipe (Сообщение 157821)
П.с. Можно ли не брать на работу людей, которые не ответили на этот вопрос? =)

Если работа заключается в сложении массивов с объектами, то не стоит.

Gvozd 16.02.2012 12:32

Цитата:

Сообщение от Snipe
Я уже нашел ответ в интернетах. Но публиковать пока не буду.

Цитата:

Сообщение от Snipe
Я уже нашел ответ в интернетах. Но публиковать пока не буду.

SPOILER

Лень искать, но я так понял фишка в том, что консоль(как и eval) возвращает значение последнего вычисленного выражения
eval показывает такие же результаты.
Вот только я не понял почему в одних случаях выдается результат всей операции, а в других только правая часть

SPOILER

Snipe 16.02.2012 12:46

А ладно
ОТВЕТ
Суть в том, что {} в начале строки не является объявлением объекта, а является пустым блоком, который игнорируется. В итоге получается +[] или +{}
ОТВЕТ

B@rmaley.e><e 16.02.2012 17:45

Цитата:

Сообщение от Snipe
Можно ли не брать на работу людей, которые не ответили на этот вопрос?

Если в Вашем коде такое встречается — то даже нужно.

Mахmахmахimus 16.02.2012 18:11

СПОЙЛЕР!!!!!!!!
СПОЙЛЕР!!!!!!!!
СПОЙЛЕР!!!!!!!!
СПОЙЛЕР!!!!!!!!


console.log - приводит к строкам, а оператор + приводит к числам, и соответственно пустой обьект превращается в nan. NaN + NaN = NaN.

но вот это вот я не понял вообще

>{}+[]
0

>NaN + 0
NaN

>NaN + ""
"NaN"

monolithed 16.02.2012 18:40

[
         [],              // ' ', пусто потому что массив не содержит элементов
         {},              //[object Object] потому что нет length
         [].toString(),   // '' пусто
         {}.toString(),   // [object Object]
         {} + {},         //{}.toString() + {}.toString() [object Object][object Object]
         [] + [],         // ' ' + ' ' = ' '
         +[],             // 0, потому что (' ' == 0) = true, т.е. срабатывает неявное преобразование [].valueOf()
         +{}              //NaN
];


В остальном все зависит от реализации

Mахmахmахimus 16.02.2012 19:02

monolithed,
+[] вернет 0
+{} вернет NaN
____
{}+[] то же самое что NaN+0

а NaN + 0 будет нихуя не 0


Часовой пояс GMT +3, время: 00:58.