Согласно стандарту EcmaScript 262. Операторы +
и -
ведут себя по-разному, когда задействованы строки. Первое преобразует каждое значение в строку. Второе преобразует каждое значение в число.
Из стандарта:
Если Type (lprim) является String или Type (rprim) является String, то верните строку, которая является результатом объединения ToString (lprim) а затем ToString (rprim)
blockquote>. Это означает, что если в выражении есть строковое значение, все значения, участвующие в операции
+
, преобразуются в строку. В JavaScript, когда оператор+
используется со строками, он объединяет их. Вот почемуconsole.log("5"+1)
возвращает «51».1
преобразуется в строку, а затем «5» + «1» объединяются вместе.Тем не менее, вышеприведенное правило не применяется к оператору
-
. Когда вы используете-
, все значения преобразуются в номера в соответствии со стандартом (см. Ниже). Поэтому в этом случае"5"
преобразуется в5
, а затем1
вычитается.Из стандарта:
5 Пусть lnum будет ToNumber (lval).
6 Пусть rnum будет ToNumber (rval).
blockquote>Определение оператора из стандартного EcmaScript 262.
Оператор +: http://www.ecma-international.org/ecma-262/5.1/# sec-11.6.1 [/g3]
Оператор -: http://www.ecma-international.org/ecma-262/5.1/#sec- 11.6.2 [/g4]