Учтите это:
b = "foo"
c = b++
console.log(c)
Поскольку постфикс ++
возвращает значение до увеличения, мы ожидаем, что c
будет foo
, однако это NaN
. Почему это так?
Это разработано и описано в стандарте следующим образом (выделено мое):
12.4.4.1 Семантика времени выполнения: оценка
UpdateExpression: LeftHandSideExpression ++
Пусть lhs будет результатом вычисления LeftHandSideExpression.
Пусть oldValue будет? ToNumber (? GetValue (lhs)).
Пусть newValue будет результатом добавления значения 1 к oldValue, используя те же правила, что и для оператора + (см. 12.8. 5).
Выполнить? PutValue (lhs, newValue).
Возвращение oldValue.
В переводе на квази-JavaScript приведенный выше алгоритм будет выглядеть так:
function postIncrement(someVariable) {
let oldValue = Number(someVariable.value); // Note "Number" here
let newValue = oldValue + 1;
someVariable.value = newValue;
return oldValue;
}
Другими словами, value++
возвращает не только значение, но и значение, преобразованное в число. Преобразование происходит до приращения, и, поскольку Number("foo")
равно NaN
, это то, что мы получаем.
Еще одна хитрость JavaScript, на которую стоит обратить внимание!