JavaScript

ЯзваСкрипт как происходит сложение {} + [] = 0?

Откройте консоль и введите {} + [] именно в консоле
0+0=0
Логично

Почитай какой тип к какому и когда приводится
TA
Tarazi Asaubay
82 200
Лучший ответ
Юрий Карачков А теперь откройте редактор в файле HTML напишите код console.log( {} + [] ) Вы увидите в консоли не 0, a "[object Object]".
Не заморачивайся: автоматическое приведение типов в JavaScript - это, мягко говоря, бред сумасшедшего. Можешь, например, заглянуть в https://habr.com/ru/company/ruvds/blog/347866/

И тут 2 варианта написания кода: либо вызубрить все возможные комбинации и отслеживать их в процессе написания кода, либо во всех неочевидных местах явно проверять / приводить типы. Первый вариант - компактный, плохо читаемый, предельно ненадёжный код. Второй вариант - код громоздкий, но более безопасный.

Есть ещё вариант использовать TypeScript, но он - со своей структурной типизацией - проблему надёжности JS-кода лишь ослабляет, но не решает.
null == 0; // false
undefined == ""; // false
null == false; // false
undefined == false; // false
null == undefined; // true
{} + []

{} — это не создание объекта, а скобка кода, внутри которого нет кода, т. е. она просто игнорируется)

Выполняется +[], где унарный плюс просто преобразует массив в число: Number([]) → 0

На выходе получается 0.
____________

Доказательство:

{ console.log("moo") } + [1, 2, 3]
// >> "moo"
// >> NaN

{ console.log("moo") } + [14]
// >> "moo"
// >> 14

Array.prototype.valueOf = function() {
  return 100;
};

{} + []; // 100
____________

Вроде никакого сумасшествия...
Эквивалентно такой записи:

{};
+[];
____________

[] + {} // "[object Object]"

Использован оператор плюс: После него уже не может быть свободного блока кода, он как-то должен обрабатываться в рамках этой операции.

Создаются массив [] и объект {}, оба преобразуются в строки, [].toString() → пустая строка, ({}).toString() → "[object Object]".

Можно убедиться, что вызывается toString:

Array.prototype.toString = function() {
  return "bubu";
};

[] + {}; // "bubu[object Object]"
Юрий Карачков Ну это я уже понял что {} игнорируется и что это пустой блок кода, называемый составной оператор.
Юрий Карачков Спасибо за подробное объяснение, отмечу как лучший ответ
Евгений Гордеев >> вызывается toString
Это не всегда верно (см. известный символ toPrimitive). Но автору вопроса, конечно, вполне сойдет и объяснение в ответе.

>> Вроде никакого сумасшествия...
У Андрея и прочих казуалов просто душевная травма от попытки использования JS в стиле "напишу не думая, и если обосрусь, то пусть папа-интерпретатор подотрет мне жопку" - поэтому не стоит воспринимать их обиженный хейт серьезно: у таких людей молоток виноват в отбитых пальцах.
Кто способен прочесть и понять простую и стройную логику типкастов, тот и сам все осознает.