JavaScript: результат undefined ++ - это NaN, а не undefined? - PullRequest
3 голосов
/ 01 октября 2019

Первый console.log вывод равен 2. Без сомнения.
Но почему второй выход console.log не является неопределенным? Не следует ли сначала выводить undefined, тогда переменная b становится NaN?

var a = 2;
console.log(a++);

var b;
console.log(b++);

Ответы [ 3 ]

8 голосов
/ 01 октября 2019

Учтите это:

b = "foo"
c = b++
console.log(c) 

Поскольку постфикс ++ возвращает значение до увеличения, мы ожидаем, что c будет foo, однако это NaN. Почему это так?

Это разработано и описано в стандарте следующим образом (выделено мое):

12.4.4.1 Семантика времени выполнения: оценка

UpdateExpression: LeftHandSideExpression ++

  1. Пусть lhs будет результатом вычисления LeftHandSideExpression.

  2. Пусть oldValue будет? ToNumber (? GetValue (lhs)).

  3. Пусть newValue будет результатом добавления значения 1 к oldValue, используя те же правила, что и для оператора + (см. 12.8. 5).

  4. Выполнить? PutValue (lhs, newValue).

  5. Возвращение 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, на которую стоит обратить внимание!

0 голосов
/ 01 октября 2019

var a = 2;

Здесь вы объявили переменную "a" со значением "2", сделав ее тип данных "INTEGER".

console.log(a++);

Вывод равен 2 ипеременная "a" имеет значение "3".

var b;

Здесь вы объявили переменную "b" без какого-либо значения, сделав ее тип данных "UNDEFINED".

console.log(b++);

Выходное значение равно NaN, поскольку переменная "b" равна нулю и, следовательно, оператор приращения не может быть применен.

0 голосов
/ 01 октября 2019

Вам необходимо присвоить значение b или проверить нулевое условие перед регистрацией b. b - это NaN, потому что его b ++ - проверка номера.

...