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)
考虑一下:
b = "foo"
c = b++
console.log(c) Run Code Online (Sandbox Code Playgroud)
由于后缀++递增之前返回值,我们希望c是foo,但是,它的NaN。这是为什么?
这是设计使然,在标准(强调我的)中描述如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
换句话说,不仅value++返回值,而且还返回转换为数字的值。该转换发生之前增加,并且由于Number("foo")是NaN,这就是我们得到的。
需要注意的另一个JavaScript怪癖!
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |