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

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

Тест 1:

typeof {}+[]  //"object"

Хорошо, итак {}+[] является object,

Тест 2:

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

Какие? не имели {}+[] является object? Почему это string сейчас?

Тест 3:

console.log({}+[])

Что я имею:

Так что это number!... нет?

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

ОБНОВЛЕНО

Людям, которые говорят {}+[] пустая строка:

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

JavaScript так сложно понять...

2 ответа

Решение

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

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

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

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

ОБНОВЛЕНО

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

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

  • ({};+[]) === "" //SyntaxError
    Я думаю, это само за себя:)

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

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

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

Другие вопросы по тегам