Ответ 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]"
, см. Выше.