Почему ({} + {}). Длина равна 30?

{} в строку?

Кто-нибудь может сказать мне, почему это 30?

({}+{}).length //  = 30?

Но это 0?

([] + []).length //  = 0?

Ответ 1

Это ожидаемое поведение. Когда вы используете оператор + на 2 массивах, оба массива передаются в строку, которая в основном совпадает с вызовом .join(','). Если массивы оба пустые, вы получите две пустые строки, объединенные в одну пустую строку с длиной 0.

([] + []) = ""

Однако с объектами способ, которым они передаются в строку, отличается. По умолчанию оператор + будет передавать объекты в строки, что приведет к тому, что строка "[object Object]" сделает это дважды, и вы получите длинную строку символов 30.

({}+{}) = "[object Object][object Object]"

Ответ 2

Оператор + в Javascript используется для добавления чисел или строк, но при использовании в объекте он по существу вызывает прототип toString.

Итак: ({}).toString() есть [object Object]

И, если вы добавите две строки вместе, это [object Object] Вы получаете: [object Object][object Object], поэтому длина равна 30.

Но пустой массив [] для строки - это просто "", поэтому два комбинированных "" все еще справедливы: "", поэтому длина равна 0.

([]).toString() // -> ""