var a = "ab";
var b = "ab";
a+=1; // "ab1"
b++; // "NaN"
(Tested on chrome's V8)
Can someone explain why the results are different based on the internal atomic actions of the ++
arithmetic operator and the +=
assignment operator with argument 1
++
converts to number, and then increments,+=
with a String concatenates.From the spec:
For the
a+=1
case, if you add a number to a string or the other way around the number gets converted to a string:++
tries to increment a Number (if it's not a number, this will fail - resulting inNaN
)+=
is concatenation, in this case the JavaScript engine figures out that one side is a string, so they're both concatenated as strings.They're different because they're different operations,
++
is specifically an arithmetic operator, where as+=
is a more general assignment operator that behaves differently based on the data type - specifically, string has its own implementation.That's because the + operator in javascript is both the mathematical + and the string concatenation operator, while the ++ is always a mathematical operator.
So, when you have:
string = string + number;
the number is converted to string and concatenated to the first string.
When you have
string++
you will convert the string to a number, getting NaN, and then add one to that - getting still, NaN.