Почему в JavaScript (принуждение) 1 + '1' = '11' и 1 - '1' = 0?

Это кажется совершенно очевидным в своей логике (строка не может вычитать), но я хотел бы знать, как это решение принимается при выполнении JavaScript. Как точно применяются правила принуждения здесь?

Ответ 1

- определяется в терминах ToNumber, тогда как + имеет дополнительное предложение для строк (акцент мой):

11.6.1 Оператор добавления (+)

Оператор сложения выполняет либо конкатенацию строк, либо числовую дополнение.

Производство

AdditiveExpression : AdditiveExpression +  MultiplicativeExpression 

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

  • Пусть lref будет результатом оценки AdditiveExpression.
  • Пусть lval be GetValue(lref).
  • Пусть rref является результатом оценки MultiplicativeExpression.
  • Пусть rval be GetValue(rref).
  • Пусть lprim be ToPrimitive(lval).
  • Пусть rprim be ToPrimitive(rval).
  • Если Type(lprim) - String или Type(rprim) - String, тогда
  • Вернуть строку, которая является результатом объединения ToString(lprim), за которым следует ToString(rprim)

[...]