Вопросник по преобразованиям, для объектов
Подумайте, какой результат будет у выражений ниже. Когда закончите – сверьтесь с решением.
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
, так что складываются в итоге строковые представления объектов.