Проблемы с добавлением объекта с массивом
Вдохновленный этим видео, я проверил дальше {}+[]
,
Тест 1:
typeof {}+[] //"object"
Хорошо, итак {}+[]
является object
,
Тест 2:
var crazy = {}+[];
typeof crazy //"string"
Какие? не имели {}+[]
является object
? Почему это string
сейчас?
Тест 3:
console.log({}+[])
Что я имею:
Так что это number
!... нет?
Так что на самом деле является типом{}+[]
??
ОБНОВЛЕНО
Людям, которые говорят {}+[]
пустая строка:
{}+[] === "" //false
({}+[]) === "" //false
({};+[]) === "" //SyntaxError
({}+[]).length //15
JavaScript так сложно понять...
2 ответа
Тип {}+[]
может варьироваться в зависимости от контекста.
typeof {}+[] //"object"
В соответствии с приоритетом операторов в этом случаеtypeof {}
оценивает "объект",+[]
добавляет пустую строку (массив приводится к строке), поэтому результатом является "объект".
Вы могли бы подумать о проверкеtypeof ({}+[])
(твой второй случай).var crazy = {}+[]; typeof crazy //"string"
В этом случае вы добавляете объект и массив - они оба приводятся к строке, поэтомуtypeof
возвращает "строку".{}+[]
Это интерпретируется как пустой блок кода, унарный плюс и пустой массив. Первая часть ничего не делает, массив преобразуется в разделенную запятыми строку своих элементов (пустая строка для пустого массива), затем в число (пустая строка преобразуется в 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)