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

11

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

Test 1:

<code>typeof {}+[]  //"object"
</code>

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

Test 2:

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

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

Test 3:

<code>console.log({}+[])
</code>

Что я имею:

enter image description here

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

Такwhat actually is the type of {}+[]??

UPDATED

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

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

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

@pcamal, так это число или строка? (Думал{}+[] было быobject, потому что они оба.) Derek 朕會功夫
Я думаю, что в test1 typeof находит тип первого параметра - & gt; {}, и это объект, попробуйтеtypeof ({}+[]) этот, это строка. ocanal
JavaScript is so hard to understandНу, это потому, что вы неоднозначны;) При встрече{} в{}+[] === "" парсер не знает,{} должен указывать объектный литерал или блок. Поскольку это не в контексте выражения,{} интерпретируется как блок (поведение по умолчанию). Скобка(...) force оценка как выражение. Felix Kling
Я просто добавил это, чтобы указать, что линия{}+[] интерпретируется как два утверждения, а не как одно. Но так как JavaScript имеет автоматическую вставку точек с запятой, он может это сделать. Зачем? Потому что, если какой-то синтаксис неоднозначен, необходимо принять решение, как его интерпретировать. В этом случае разработчики решили интерпретировать{}+[] какblock, unary plus, array  а не какobject, addition operator, array, Вы можете не согласиться с этим, но так оно и есть :) Felix Kling
Что касается вашего обновления:{}+[] === "" оценивается как{}; +[] === "";то есть пустой блок и+[] === "". {}+[] === 0 доходностьtrue. Felix Kling

Ваш Ответ

2   ответа
13

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

typeof {}+[] //"object"
As per operators precedence in this case typeof {} evaluates to "object", +[] adds an empty string(array is coerced to string) therefore result is "object".
You could think of checking typeof ({}+[]) (your second case).

var crazy = {}+[]; typeof crazy //"string"
In this case you are adding object and array - they both coerce to string, therefore typeof returns "string".

{}+[]
This is interpreted as an empty block of code, unary plus and empty array. First part does nothing, array is converted to a comma-separated string of it's elements(empty string for empty array), then to a number(empty string is converted to 0), hence 0.

UPDATED

{}+[] === "" //false
see #3, {} is interpreted as a block, you are getting 0 on the left.
Compare {}+[] === 0 // true.

({}+[]) === "" //false
see #1, {} is interpreted as an object literal. When trying to add array and object, they both convert to string, "[object Object]" for object and empty string for array. Hence, you are getting "[object Object]" on the left.
Compare ({}+[]) === "[object Object]" // true.

({};+[]) === "" //SyntaxError
I guess, this one is self-explanatory :)

({}+[]).length //15
15 is exactly the length of "[object Object]", see above.

Error: User Rate Limit Exceeded({}+[])Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded""Error: User Rate Limit Exceeded0? Derek 朕會功夫
Error: User Rate Limit Exceeded+""Error: User Rate Limit Exceeded0Error: User Rate Limit ExceedednotError: User Rate Limit Exceeded+"abc"Error: User Rate Limit ExceededNaNError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0
var f = {}+[];
console.log(f==="[object Object]")

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

Похожие вопросы