Javascript ++ vs + = 1
var a = "ab";
var b = "ab";
a+=1; // "ab1"
b++; // "NaN"
(Протестировано на хроме V8)
Может кто-нибудь объяснить, почему результаты различаются на основе внутренних атомных действий арифметического оператора ++
и оператора присваивания +=
с аргументом 1
Ответы
Ответ 1
++
преобразуется в число, а затем увеличивает, +=
с конкатенацией строки.
Из спецификации:
11.3.1 Оператор приращения Postfix
...
3. Пусть oldValue
be ToNumber(GetValue(lhs))
.
4. Пусть newValue
- результат добавления значения 1 в oldValue
, используя те же правила, что и для оператора +
(см. 11.6.3).
В случае a+=1
, если вы добавите число в строку или наоборот, число будет преобразовано в строку:
11.6.1 Оператор сложения (+)
...
7. Если Type(lprim)
- String или Type(rprim)
- String, то а. Вернуть строку, которая является результатом объединения ToString (lprim), а затем ToString (rprim)
8. Верните результат применения операции добавления в ToNumber (lprim) и ToNumber (rprim).
Ответ 2
-
++
пытается увеличить число (если это не число, это не удастся, что приведет к NaN
)
-
+=
является конкатенацией, в этом случае механизм JavaScript показывает, что одна сторона является строкой, поэтому они оба объединены как строки.
Они разные, потому что они разные операции, ++
- это скорее арифметический оператор, где +=
- это больше общий оператор присваивания, который ведет себя по-разному на основе типа данных - в частности, string имеет его собственной реализации.
Ответ 3
Это потому, что оператор + в javascript является как математическим, так и оператором конкатенации строк, тогда как ++ всегда является математическим оператором.
Итак, когда у вас есть:
string = string + number;
число преобразуется в строку и конкатенируется с первой строкой.
Если у вас
string++
вы преобразуете строку в число, получив NaN, а затем добавьте ее к ней - все равно, NaN.