第一个console.log输出为2。毫无疑问。但是为什么第二个console.log输出不是未定义的呢?首先不应该输出undefined,然后变量b变为NaN吗?
var a = 2;
console.log(a++);
var b;
console.log(b++);
考虑此:
b = "foo"
c = b++
console.log(c)
由于后缀++
返回递增前的值,因此我们希望c
为foo
,但是它为NaN
。为什么会这样?
这是设计使然,在标准(强调我的)中描述如下:
12.4.4.1 Runtime Semantics: Evaluation
UpdateExpression:LeftHandSideExpression ++
让我作为评估LeftHandSideExpression的结果。
让oldValue为? ToNumber(?GetValue(lhs))。
让newValue是将值1添加到oldValue的结果,使用与+运算符相同的规则(请参见12.8.5)。
执行? PutValue(lhs,newValue)。
返回oldValue。
换句话说,value++
不仅返回值,而且还返回转换为数字的值。转换发生在递增之前,并且由于Number("foo")
为NaN
,所以我们得到了此结果。
还有另一个JavaScript怪癖要注意!
var a = 2;
这里您已声明一个值为“ 2”的变量“ a”,其数据类型为“ INTEGER”。
console.log(a++);
输出为2,变量“ a”的值为“ 3”。
var b;
这里您已声明一个不带任何值的变量“ b”,使其数据类型为“ UNDEFINED”。
console.log(b++);
输出为NaN,因为变量“ b”没有默认值,因此也不能应用增量运算符。
您需要为b赋值或在登录b之前检查空条件。b是NaN,因为其b ++检查数字。