Подтвердить что ты не робот

Проблемы с добавлением объекта с массивом

Вдохновленный этим видео, я тестировал далее {}+[].

Тест 1:

typeof {}+[]  //"object"

Хорошо, поэтому {}+[] является object.

Тест 2:

var crazy = {}+[];
typeof crazy  //"string"

Что? Разве {}+[] не был object? Почему теперь string?

Тест 3:

console.log({}+[])

Что я получил:

enter image description here

Итак, это number!... Нет?

Итак что на самом деле является типом {}+[]??

ОБНОВЛЕНО

Для людей, которые говорят, что {}+[] - пустая строка:

{}+[] === ""     //false
({}+[]) === ""   //false
({};+[]) === ""  //SyntaxError
({}+[]).length   //15

JavaScript так трудно понять...

4b9b3361

Ответ 1

Тип {}+[] может варьироваться в зависимости от контекста.

  • typeof {}+[] //"object"
    В соответствии с приоритетом операторов в этом случае typeof {} оценивается как "объект", +[] добавляет пустую строку (массив принуждается к строке), поэтому результатом является "объект".
    Вы могли бы подумать о проверке typeof ({}+[]) (ваш второй случай).

  • var crazy = {}+[]; typeof crazy //"string"
    В этом случае вы добавляете объект и массив - они оба принуждают к строке, поэтому typeof возвращает "string".

  • {}+[]
    Это интерпретируется как пустой блок кода, унарный плюс и пустой массив. Первая часть ничего не делает, массив преобразуется в разделенную запятыми строку его элементов (пустая строка для пустого массива), затем к числу (пустая строка преобразуется в 0), следовательно 0.

ОБНОВЛЕНО

  • {}+[] === "" //false
    см. # 3, {} интерпретируется как блок, вы получаете 0 слева.
    Сравните {}+[] === 0 // true.

  • ({}+[]) === "" //false
    см. # 1, {} интерпретируется как литерал объекта. При попытке добавить массив и объект они преобразуются в строку, "[object Object]" для объекта и пустую строку для массива. Следовательно, вы получаете "[object Object]" слева.
    Сравните ({}+[]) === "[object Object]" // true.

  • ({};+[]) === "" //SyntaxError
    Я думаю, это самоочевидно:)

  • ({}+[]).length //15
    15 - это точно длина "[object Object]", см. Выше.

Ответ 2

var f = {}+[];
console.log(f==="[object Object]")

это будет log true, потому что, когда вы назначаете {}+[] в var, он преобразует его в строку с помощью метода toString() этого..., который в этом случае возвращает "[object Object]" (который 15 букв в длину - и то, где длина = 15)