Добавление строк в JavaScript "1" + - "2" == "1-2"
Я случайно набрал следующий оператор JavaScript "1" + - "2"
, и у меня есть результат "1-2"
.
Я не уверен, почему знак минуса рассматривался как строка, а не вызывал синтаксическую ошибку.
Я попытался выполнить поиск, но я не получил ответ, который хотел.
Почему знак минус обрабатывался как строка? это там онлайн-ссылка, на которую я могу смотреть? спасибо
Ответы
Ответ 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"
.