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.