Simple: - "2" evaluates to -2 because unary - coerces its operand to a number, which is precisely the behavior defined in the ECMA-262 spec.
11.4.7 Unary - Operator
The unary - operator converts its operand to Number type and then negates it. Note that negating +0 produces −0, and negating −0 produces +0.
The production UnaryExpression : - UnaryExpression is evaluated as follows:
- Let expr be the result of evaluating UnaryExpression.
- Let oldValue be ToNumber(GetValue(expr)).
- If oldValue is NaN, return NaN.
- Return the result of negating oldValue; that is, compute a Number with the same magnitude but opposite sign.
Then it's just a matter of string concatenation: "1" + (-2) evaluates, unsurprisingly, to "1-2". By this point it should comes as no surprise that the + is a string concatenation (and not an addition) operator in the context because that's what the spec says.
TL;DR
Because, as always, that's the behavior required by the spec.
"1" + + "2"is also valid (returns"12"), but"1" ++ "2"is a syntax error because the++operator is not the same as two+operators in a row. And something silly like"1" + - + - "2"is valid too...