Оператор сложения проходит серию шагов, чтобы выяснить, что делать в зависимости от его операндов.
Прежде всего, он попытается преобразовать свои операнды в примитивы, а затем обработать результат. Когда объект преобразуется в примитив, он становится строкой, числом, логическим значением и т. Д., В зависимости от реализации объекта toString
и / или valueOf
, Если он заканчивается двумя строками, он объединяет их. Если нет, он преобразует примитивы в числа и добавляет их математически.
Простой объект (такой как в вашем коде) конвертируется в строку "[object Object]"
. Итак, ваш результат состоит в том, что строка соединена сама с собой: "[object Object][object Object]"
:
var obj = {name:"mango"};
var obj2 = {name:"mango"};
var result=obj+obj2; // It's not an object, so I called it `result`
console.log(result);
Некоторые объекты вместо этого преобразуются в числа или другие примитивы из-за реализации toString
и / или valueOf
. Как я уже говорил выше, если объект преобразуется в примитив, отличный от строки или числа, оператор сложения преобразует примитив в число. Например:
const a = {
value: true,
valueOf() {
return this.value;
}
};
const b = {
value: 41,
valueOf() {
return this.value;
}
};
const result = a + b;
console.log(result); // 42
В этом примере a
преобразуется в примитив true
(логическое значение), а b
преобразуется в число 41
. Поскольку это не обе строки, оператор сложения преобразует их в числа (41
уже является числом, true
преобразуется в 1
) и складывает их вместе, получая 42
.