Боюсь, это немного, но сложнее, чем объясняется здесь.
Название вопроса:
Каков результат добавления объекта и массива в JavaScript?
И тогда возникает вопрос о выражении {}+[]
, которое каждый здесь предполагает, что оно оценивается как '[object Object]'
- , но всегда ли это?
Нажмите Shift + Control + J прямо сейчас и введите {}+[]
в приглашении >
:

Может быть, это ошибка браузера? Давайте попробуем то же самое в Node:

Здесь происходит что-то интересное.
Плюс (+
) - который на самом деле называется «оператор сложения» , а не «оператор конкатенации» , как кто-то здесь написал - см. ECMA- 262, 6-е издание, раздел 12.7.3 - Оператор сложения (+) - выполняет объединение строк или числовое сложение , что очень важно для понимания подобных примеров.
Кто-то однажды задал мне такой вопрос:
Если alert({}+[])
показывает '[object Object]'
, а x = {}+[]
помещает '[объект объекта]' в x
, тогда почему запись {}+[]
в консоли или узле REPL дает 0
?

Ответ заключается в том, что при использовании оператора «плюс» для объекта и массива они покрывают их строками - строкой '[object Object]'
и пустой строкой соответственно - здесь мы на самом деле не добавляем объект в объект массив! {}
интерпретируется как пустой блок и вычисляется как ничто, поэтому +
теперь оценивается как унарный оператор , приводящий массив []
к числу, которое оказывается нулевым для пустой массив - но это не количество элементов, а 0 для пустого массива, первый элемент преобразуется в число, если это может быть, или NaN, если это невозможно, для одноэлементных массивов, и NaN для любых массивов с более одного элемента.
Еще несколько интересных результатов, попробуйте все комбинации {}
и []
с операторами +
, -
, *
и /
:
$ node
> []+[]
''
> {}+{}
'[object Object][object Object]'
> []+{}
'[object Object]'
> {}+[]
0
> []-[]
0
> {}-{}
NaN
> []-{}
NaN
> {}-[]
-0
> []*[]
0
> {}*{}
NaN
> []*{}
NaN
> {}*[]
... ^C
> []/[]
NaN
> {}/{}
NaN
> []/{}
NaN
> {}/[]
SyntaxError: Invalid regular expression: missing /
at Object.exports.createScript (vm.js:24:10)
at REPLServer.defaultEval (repl.js:137:25)
at bound (domain.js:250:14)
at REPLServer.runBound [as eval] (domain.js:263:12)
at REPLServer.<anonymous> (repl.js:392:12)
at emitOne (events.js:82:20)
at REPLServer.emit (events.js:169:7)
at REPLServer.Interface._onLine (readline.js:210:10)
at REPLServer.Interface._line (readline.js:546:8)
at REPLServer.Interface._ttyWrite (readline.js:823:14)
Это один из лучших способов выучить все причуды языков наизнанку.