JAVASCRIPT:未定义++的结果是NaN,不是未定义?
第一个console.log输出为2。毫无疑问。
但是为什么第二个console.log输出不是未定义的呢?不应该先输出未定义的,然后变量b变成NaN吗?
var a = 2;
console.log(a++);
var b;
console.log(b++);
解决方案
考虑一下:
数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">b = "foo"
c = b++
console.log(c)
因为后缀++
返回递增前的值,所以我们预计c
是foo
,但它是NaN
。为什么会这样?
这是经过设计的,在标准(重点是我的)中描述如下:
12.4.4.1 Runtime Semantics: Evaluation
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怪癖!
相关文章