And*_*iga 25 javascript unary-operator
这是使用一元运算符"++"的测试情况:
var j = 0 ;
console.log(j);
j = j++;
console.log(j);
Run Code Online (Sandbox Code Playgroud)
为此,输出为:
0
0
Run Code Online (Sandbox Code Playgroud)
由于++运算符的位置位于操作数的后面,因此它的优先级低于赋值的优先级,我希望"j"首先接收自身的值(ie0),然后递增.那么为什么第二个console.log(j)
电话仍然显示为"0"?
为了清楚起见,我知道解决方案是:
// 1)
j++;
// 2)
++j;
// 3)
j += 1;
// 4)
j = ++j;
Run Code Online (Sandbox Code Playgroud)
但我需要知道为什么在这个特定情况下不进行增量步骤,而不是如何解决它!
Lig*_*ica 52
使用后增量时,这是一种不直观(但不是"怪异"!)的行为.
声明j = j++
是这样做的:
foo() = j++
j
(0),并记住它作为结果;j
(获得1);j
(0).结果是无操作.
这里的关键是在最终分配之前评估整个RHS并执行后增量.
http://www.ecma-international.org/ecma-262/5.1/#sec-11.3.1
http://www.ecma-international.org/ecma-262/5.1/#sec-11.13.1
the*_*eye 10
- 让lhs成为评估LeftHandSideExpression的结果.
- 如果满足以下条件,则抛出SyntaxError异常:
- 类型(lhs)是引用是真的
- IsStrictReference(lhs)是真的
- Type(GetBase(lhs))是环境记录
- GetReferencedName(lhs)是"eval"或"arguments"
- 让oldValue为ToNumber(GetValue(lhs)).
- 设newval是将值1添加到oldValue的结果,使用与+运算符相同的规则(见11.6.3).
- 调用PutValue(lhs,newValue).
- 返回oldValue.
因此,很明显,新值首先在lhs
(在这种情况下j
)设置,并且旧值作为表达式的结果返回,该值又被重新设置j
.所以,价值不会改变.
归档时间: |
|
查看次数: |
2104 次 |
最近记录: |