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

问题描述 投票:3回答:3

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

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

var b;
console.log(b++);
javascript undefined increment var hoisting
3个回答
4
投票

考虑此:

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

由于后缀++返回递增前的值,因此我们希望cfoo,但是它为NaN。为什么会这样?

这是设计使然,在标准(强调我的)中描述如下:

12.4.4.1 Runtime Semantics: Evaluation

UpdateExpression:LeftHandSideExpression ++

  1. 让我作为评估LeftHandSideExpression的结果。

  2. 让oldValue为? ToNumber(?GetValue(lhs))。

  3. 让newValue是将值1添加到oldValue的结果,使用与+运算符相同的规则(请参见12.8.5)。

  4. 执行? PutValue(lhs,newValue)。

  5. 返回oldValue。

换句话说,value++不仅返回值,而且还返回转换为数字的值。转换发生在递增之前,并且由于Number("foo")NaN,所以我们得到了此结果。

还有另一个JavaScript怪癖要注意!


-2
投票

var a = 2;

这里您已声明一个值为“ 2”的变量“ a”,其数据类型为“ INTEGER”。

console.log(a++);

输出为2,变量“ a”的值为“ 3”。

var b;

这里您已声明一个不带任何值的变量“ b”,使其数据类型为“ UNDEFINED”。

console.log(b++);

输出为NaN,因为变量“ b”没有默认值,因此也不能应用增量运算符。


-3
投票

您需要为b赋值或在登录b之前检查空条件。b是NaN,因为其b ++检查数字。

© www.soinside.com 2019 - 2024. All rights reserved.