JavaScript
ЯзваСкрипт как происходит сложение {} + [] = 0?
Откройте консоль и введите {} + [] именно в консоле
0+0=0
Логично
Почитай какой тип к какому и когда приводится
Логично
Почитай какой тип к какому и когда приводится
Юрий Карачков
А теперь откройте редактор в файле HTML напишите код console.log( {} + [] ) Вы увидите в консоли не 0, a "[object Object]".
Не заморачивайся: автоматическое приведение типов в JavaScript - это, мягко говоря, бред сумасшедшего. Можешь, например, заглянуть в https://habr.com/ru/company/ruvds/blog/347866/
И тут 2 варианта написания кода: либо вызубрить все возможные комбинации и отслеживать их в процессе написания кода, либо во всех неочевидных местах явно проверять / приводить типы. Первый вариант - компактный, плохо читаемый, предельно ненадёжный код. Второй вариант - код громоздкий, но более безопасный.
Есть ещё вариант использовать TypeScript, но он - со своей структурной типизацией - проблему надёжности JS-кода лишь ослабляет, но не решает.
И тут 2 варианта написания кода: либо вызубрить все возможные комбинации и отслеживать их в процессе написания кода, либо во всех неочевидных местах явно проверять / приводить типы. Первый вариант - компактный, плохо читаемый, предельно ненадёжный код. Второй вариант - код громоздкий, но более безопасный.
Есть ещё вариант использовать TypeScript, но он - со своей структурной типизацией - проблему надёжности JS-кода лишь ослабляет, но не решает.
null == 0; // false
undefined == ""; // false
null == false; // false
undefined == false; // false
null == undefined; // true
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]"
{} — это не создание объекта, а скобка кода, внутри которого нет кода, т. е. она просто игнорируется)
Выполняется +[], где унарный плюс просто преобразует массив в число: 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 в стиле "напишу не думая, и если обосрусь, то пусть папа-интерпретатор подотрет мне жопку" - поэтому не стоит воспринимать их обиженный хейт серьезно: у таких людей молоток виноват в отбитых пальцах.
Кто способен прочесть и понять простую и стройную логику типкастов, тот и сам все осознает.
Это не всегда верно (см. известный символ toPrimitive). Но автору вопроса, конечно, вполне сойдет и объяснение в ответе.
>> Вроде никакого сумасшествия...
У Андрея и прочих казуалов просто душевная травма от попытки использования JS в стиле "напишу не думая, и если обосрусь, то пусть папа-интерпретатор подотрет мне жопку" - поэтому не стоит воспринимать их обиженный хейт серьезно: у таких людей молоток виноват в отбитых пальцах.
Кто способен прочесть и понять простую и стройную логику типкастов, тот и сам все осознает.
Похожие вопросы
- Почему d[0] не изменяется ?
- Почему цикл while не останавливается когда i=0 ?
- Чему равно значение выражения - "0 || 1 && 2 || 3" ?
- Как только с конца массива обрезать все пустые элементы? var arr = [0,,2,,,];
- Стать Junior программистом на JavaScript за пол года с 0?
- Объясните код. Что происходит на каждой строчке. Поэтапно.
- Как на сайтах происходит постоянное обновление информации?
- Математика, сложение процентов почему 40% + 80% = 0.72, а не 120%?
- Перегрузка сложения в С++
- Что такое сложение по модулю?