@GoodPirojok

Как работает оператор +?

Когда речь идёт о
'2' + 2
то вроде логично, что если всё начинается со строки, то всё должно быть строкой
и вроде как
2 + '2'
уже должно вывести ошибку, что мы к числу хотим прибавить строку.
  • Вопрос задан
  • 143 просмотра
Решения вопроса 5
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
В js оператор + перегружен. Можно представить, что под капотом он вызывает функцию от двух аргументов (левого и правого операнда), примерно такую:
function add(left, right) {
  const typeLeft = typeof left;
  const typeRight = typeof right;
  if(typeLeft === 'string') {
    return left.concat(right);
  }
  if(typeRight === 'string') {
    return right.concat(left);
  }
  if(canConvertToNumber(left, typeLeft) && canConvertToNumber(right, typeRight)) {
    return Number(left) + Number(right); // тут уже не перегруженный вариант + иначе будет бесконечная рекурсия
  }
  if(typeLeft === 'bigint' && typeRight === 'bigint') {
    return left + right; // опять не перегруженный вариант
  }
  if(
    (typeLeft === 'bigint' && canConvertToNumber(right, typeRight))
    || (typeRight === 'bigint' && canConvertToNumber(left, typeLeft))
  ) {
    // если предыдущий if не прошел, а проходит этот
    // то мы складываем bigint с не bigint, а так нельзя
    throw new TypeError('Cannot mix BigInt and other types, use explicit conversions');
  }
  // во всех остальных случаях приводим к строке:
  return String(left).concat(right);
}

function canConvertToNumber(item, type) {
  return item === null || type === 'number' || type === 'boolean' || type === 'undefined';
}
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
+ является особенным оператором, исключением, отличающимся от других математических операторов.
Почти все математические операторы выполняют численное преобразование. Исключение составляет +.
Если одно из слагаемых является строкой, тогда и все остальные приводятся к строкам.

Тогда они конкатенируются (присоединяются) друг к другу:

alert( 1 + '2' ); // '12' (строка справа)
alert( '1' + 2 ); // '12' (строка слева)
Подробнее: https://learn.javascript.ru/type-conversions

Для сравнения:
'42' / 2 // 21
'42' - 2 // 40
'42' * 2 // 84
'42' + 2 // "422"   ¯\_(ツ)_/¯

1 + 2 + 3 + 4 + 5 // 15
1 + 2 + 3 + '4' + 5 // "645"
+ работает слева-направо. Поэтому 1+2+3 всё ещё число, а дальше '4' заставляет переключиться на строки.
Ответ написан
Комментировать
Ну норм же результатом будет 22, не должно вывести никакой ошибки.
Вам следует это почитать
Ответ написан
Комментировать
Seasle
@Seasle Куратор тега JavaScript
+ это конкатенация (т. к. в выражении есть строка), а конкатенация только строк бывает.
Ответ написан
Комментировать
@Shmulhe
Оператор + в данном случае является конкатенацией.
Грубо говоря склеивает результат воедино.

Ошибку выводить не будет, т.к. js преобразует тип данных в обоих случаях в строку
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы