Что выведет этот фрагмент на приведение типов и почему?
Что выведет следующий код и почему?
console.log(1 + 2 + '3');
console.log('3' * 2);
console.log('5' - 1);
console.log([] + {});
Предскажите вывод и объясните.
Строки печатают '33', 6, 4 и '[object Object]'. + с любой строкой склеивает, поэтому (1 + 2) + '3' даёт '33'. * и - принуждают к числам, поэтому '3' * 2 это 6, а '5' - 1 это 4. [] приводится к строке '', а {} — к '[object Object]', давая '[object Object]'.
- ✗Думать, что
+всегда складывает — с любым строковым операндом он склеивает - ✗Считать, что
-и*склеивают строки, как+ - ✗Ожидать, что
{}приводится к'{}', а не к'[object Object]'
- →Почему
+в1 + 2 + '3'вычисляется строго слева направо? - →Почему
[] + {}даёт'[object Object]', а не ошибку?
Решение
Ключ — поведение + со строкой (склейка) против * и - (числовое приведение).
console.log(1 + 2 + '3'); // '33'
console.log('3' * 2); // 6
console.log('5' - 1); // 4
console.log([] + {}); // '[object Object]'
Как это работает
+ вычисляется слева направо. В 1 + 2 + '3' сначала 1 + 2 = 3 (оба числа), затем 3 + '3' — один операнд строка, поэтому происходит склейка в '33'.
Операторы * и - определены только для чисел, поэтому строки приводятся к числам: '3' * 2 это 6, а '5' - 1 это 4.
В [] + {} оба операнда приводятся к примитиву через строковое представление: [] даёт '', {} даёт '[object Object]', и склейка '' + '[object Object]' даёт '[object Object]'.