Подтвердить что ты не робот

Добавление строк в JavaScript "1" + - "2" == "1-2"

Я случайно набрал следующий оператор JavaScript "1" + - "2", и у меня есть результат "1-2". Я не уверен, почему знак минуса рассматривался как строка, а не вызывал синтаксическую ошибку.

Я попытался выполнить поиск, но я не получил ответ, который хотел.

Почему знак минус обрабатывался как строка? это там онлайн-ссылка, на которую я могу смотреть? спасибо

4b9b3361

Ответ 1

Простой: - "2" оценивается как -2, потому что унарный - принуждает свой операнд к числу, которое точно поведение, определенное в спецификации ECMA-262.

11.4.7 Унарный - Оператор

Унарный оператор - преобразует свой операнд в тип Number, а затем сбрасывает его. Обратите внимание, что отрицание +0 вызывает −0, а отрицание −0 вызывает +0.

Производственное UnaryExpression : - UnaryExpression оценивается следующим образом:

  • Пусть expr является результатом оценки UnaryExpression.
  • Пусть oldValue будет ToNumber (GetValue (expr)).
  • Если oldValue NaN, верните NaN.
  • Возвращает результат отрицания oldValue; то есть вычислить число с той же величиной, но с противоположным знаком.

Тогда это просто вопрос конкатенации строк: "1" + (-2) оценивает, что неудивительно, на "1-2". К этому моменту неудивительно, что + является оператором конкатенации строк (а не добавлением) в контексте, потому что указывает, что говорит спецификация.


TL; DR

Потому что, как всегда, поведение требуемое спецификацией.

Ответ 2

Оригинальный

"1" + - "2"

Анализируется как

"1" + ( - "2" )

Здесь - преобразует "2" в число и отрицает его, поэтому - "2" оценивается как -2. Таким образом, это становится:

"1" + (-2)

Здесь + вызывает преобразование -2 в строку, "-2", а затем простое конкатенацию строк.

Ответ 3

Унарный оператор - (-x) имеет приоритет над двоичным оператором + (x + y).

Итак, "1" + - "2" фактически анализируется как "1" + -2, который, в свою очередь, анализируется как конкатенация строки "1" + "-2", наконец, rsult в "1-2".