Вопросник по преобразованиям, для объектов
Подумайте, какой результат будет у выражений ниже. Когда закончите – сверьтесь с решением.
new Date(0) - 0
new Array(1)[0] + ""
({})[0]
[1] + 1
[1,2] + [3,4]
[] + null + 1
[[0]][0][0]
({} + {})
new Date(0) - 0 = 0 // (1)
new Array(1)[0] + "" = "undefined" // (2)
({})[0] = undefined // (3)
[1] + 1 = "11" // (4)
[1,2] + [3,4] = "1,23,4" // (5)
[] + null + 1 = "null1" // (6)
[[0]][0][0] = 0 // (7)
({} + {}) = "[object Object][object Object]" // (8)
-
new Date(0)– дата, созданная по миллисекундам и соответствующая 0 мс от 1 января 1970 года 00:00:00 UTC. Оператор минус-преобразует дату обратно в число миллисекунд, то есть в0. -
new Array(num)при вызове с единственным аргументом-числом создаёт массив данной длины, без элементов. Поэтому его нулевой элемент равенundefined, при сложении со строкой получается строка"undefined". -
Фигурные скобки – это создание пустого объекта, у него нет свойства
'0'. Так что значением будетundefined. Обратите внимание на внешние, круглые скобки. Если их убрать и запустить{}[0]в отладочной консоли браузера – будет0, т.к. скобки{}будут восприняты как пустой блок кода, после которого идёт массив. -
Массив преобразуется в строку
"1". Оператор"+"при сложении со строкой приводит второй аргумент к строке – значит будет"1" + "1" = "11". -
Массивы приводятся к строке и складываются.
-
Массив преобразуется в пустую строку
"" + null + 1, оператор"+"видит, что слева строка и преобразуетnullк строке, получается"null" + 1, и в итоге"null1". -
[[0]]– это вложенный массив[0]внутри внешнего[ ]. Затем мы берём от него нулевой элемент, и потом ещё раз.Если это непонятно, то посмотрите на такой пример:
alert( [1,[0],2][1] );Квадратные скобки после массива/объекта обозначают не другой массив, а взятие элемента.
-
Каждый объект преобразуется к примитиву. У встроенных объектов
Objectнет подходящегоvalueOf, поэтому используетсяtoString, так что складываются в итоге строковые представления объектов.