Logically, the only other thing that could happen is for an "error" or "exception" be thrown when you do
'5' - 3
There's really only 2 choices. Either convert the '5' to a number and subtract, or throw a hissy fit because it's a string.That's not perverse. It's very logical.
'5' + 3 - 3 != '5' - 3 + 3
The logical approach would be to only assume that '+' is a string concatenation if both operands are strings and otherwise type coerce into numbers. Then:
'5' + 3 = 8 '5' - 3 = 2
To someone who doesn't code Javascript for a living, the above seems like a far more consistent and useful behavior.
I'd expect "hello" - 1 to return NaN, since you can't perform numerical subtraction on something that isn't a number. That's exactly what Javascript does.
In the same way, I'd expect "hello" + 1 to return Nan, since you can't perform string concatenation on something that isn't a string, and you can't perform numerical addition on something that isn't a number.
Edited for clarity
It returns it because parseFloat("hello") = NaN, and NaN - 1 = NaN.
I think Javascript is broken here, and Python has it right.
Javascript thinks to itself 'hello' string concatenated with a 1 value.