JavaScript:undefined ++的结果是NaN,不是undefined?

Dan*_*Lin 3 javascript var increment undefined hoisting

第一个console.log输出为2。毫无疑问。
但是为什么第二个console.log输出不是未定义的呢?首先不应该输出undefined,然后变量b变为NaN吗?

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

var b;
console.log(b++);
Run Code Online (Sandbox Code Playgroud)

geo*_*org 8

考虑一下:

b = "foo"
c = b++
console.log(c) 
Run Code Online (Sandbox Code Playgroud)

由于后缀++递增之前返回值,我们希望cfoo,但是,它的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;
 }
Run Code Online (Sandbox Code Playgroud)

换句话说,不仅value++返回值,而且还返回转换为数字的值。该转换发生之前增加,并且由于Number("foo")NaN,这就是我们得到的。

需要注意的另一个JavaScript怪癖!