16.02.2012, 11:34
|
|
Профессор
|
|
Регистрация: 06.05.2008
Сообщений: 765
|
|
Wat - забавное видео про особенности js
Думаю, многие уже видели (смотреть вторую половину):
https://www.destroyallsoftware.com/talks/wat
Мне показалось все знакомым и логичным, кроме сложения пустого объекта с пустым же массивом... Почему там 0?
П.с. Можно ли не брать на работу людей, которые не ответили на этот вопрос? =)
Последний раз редактировалось Snipe, 16.02.2012 в 11:41.
|
|
16.02.2012, 11:49
|
|
prodigy
|
|
Регистрация: 01.11.2010
Сообщений: 503
|
|
Кстати что странно, так это то, что только в консоли такие результаты;
alert({} + []);
Причем если выполнить в коде
console.log({} + []);
то будет "[object Object]", а если набрать в консоли это выражение то будет Number 0.
Также для {} + {} я ожидал увидеть "[object Object][object Object]", но в консоли будет NaN, если набрать. Однако если выполнить в коде
console.log({} + {})
то будет ожидаемое
__________________
readOnly
Последний раз редактировалось poorking, 16.02.2012 в 11:53.
|
|
16.02.2012, 11:51
|
|
Профессор
|
|
Регистрация: 06.05.2008
Сообщений: 765
|
|
Если просто в коносли набрать, будет как на видео (способ ввода и результат связаны - это типа подсказка)...
Я уже нашел ответ в интернетах. Но публиковать пока не буду.
Последний раз редактировалось Snipe, 16.02.2012 в 11:53.
|
|
16.02.2012, 12:11
|
|
Профессор
|
|
Регистрация: 12.03.2008
Сообщений: 183
|
|
Сообщение от Snipe
|
П.с. Можно ли не брать на работу людей, которые не ответили на этот вопрос? =)
|
Если работа заключается в сложении массивов с объектами, то не стоит.
|
|
16.02.2012, 12:32
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от Snipe
|
Я уже нашел ответ в интернетах. Но публиковать пока не буду.
|
Сообщение от Snipe
|
Я уже нашел ответ в интернетах. Но публиковать пока не буду.
|
SPOILER
Лень искать, но я так понял фишка в том, что консоль(как и eval) возвращает значение последнего вычисленного выражения
eval показывает такие же результаты.
Вот только я не понял почему в одних случаях выдается результат всей операции, а в других только правая часть
SPOILER
|
|
16.02.2012, 12:46
|
|
Профессор
|
|
Регистрация: 06.05.2008
Сообщений: 765
|
|
А ладно
ОТВЕТ
Суть в том, что {} в начале строки не является объявлением объекта, а является пустым блоком, который игнорируется. В итоге получается +[] или +{}
ОТВЕТ
|
|
16.02.2012, 17:45
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Сообщение от Snipe
|
Можно ли не брать на работу людей, которые не ответили на этот вопрос?
|
Если в Вашем коде такое встречается — то даже нужно.
|
|
16.02.2012, 18:11
|
Профессор
|
|
Регистрация: 10.02.2012
Сообщений: 254
|
|
СПОЙЛЕР!!!!!!!!
СПОЙЛЕР!!!!!!!!
СПОЙЛЕР!!!!!!!!
СПОЙЛЕР!!!!!!!!
console.log - приводит к строкам, а оператор + приводит к числам, и соответственно пустой обьект превращается в nan. NaN + NaN = NaN.
но вот это вот я не понял вообще
>{}+[]
0
>NaN + 0
NaN
>NaN + ""
"NaN"
|
|
16.02.2012, 18:40
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
[
[], // ' ', пусто потому что массив не содержит элементов
{}, //[object Object] потому что нет length
[].toString(), // '' пусто
{}.toString(), // [object Object]
{} + {}, //{}.toString() + {}.toString() [object Object][object Object]
[] + [], // ' ' + ' ' = ' '
+[], // 0, потому что (' ' == 0) = true, т.е. срабатывает неявное преобразование [].valueOf()
+{} //NaN
];
В остальном все зависит от реализации
Последний раз редактировалось monolithed, 16.02.2012 в 19:01.
|
|
16.02.2012, 19:02
|
Профессор
|
|
Регистрация: 10.02.2012
Сообщений: 254
|
|
monolithed,
+[] вернет 0
+{} вернет NaN
____
{}+[] то же самое что NaN+0
а NaN + 0 будет нихуя не 0
|
|
|
|