var i=1;i=i++;alert(i);
为什么i=1?
------------------------------------------------------------------------------------------------------------------------------
ECMAScript® Language Specification
11.13.1 Simple Assignment ( = )
The PRoduction AssignmentExpression : LeftHandSideExpression =AssignmentExpression is evaluated as follows:
Let lref be the result of evaluating LeftHandSideExpression. Let rrefbe the result of evaluating AssignmentExpression.Let rval beGetValue(rref).Throw a SyntaxError exception if the followingconditions are all true: Type(lref) is Reference is trueIsStrictReference(lref) is true Type(GetBase(lref)) is EnvironmentRecord GetReferencedName(lref) is either "eval" or "arguments"CallPutValue(lref, rval).Return rval. NOTE When an assignment occurswithin strict mode code, its LeftHandSide must not evaluate to anunresolvable reference. If it does a ReferenceError exception isthrown upon assignment. The LeftHandSide also may not be a referenceto a data property with the attribute value {[[Writable]]:false}, toan accessor property with the attribute value {[[Set]]:undefined}, norto a non-existent property of an object whose [[Extensible]] internalproperty has the value false. In these cases a TypeError exception isthrown.
注意這兩句:
Let rval be GetValue(rref).Call PutValue(lref, rval).
也就是說,首先執行 i++,此時 i 被賦值 2,並返回 1,然後再賦值 1 給 i,最終 i 爲 1。
簡單地說,
var i = 1;i = i++;
等價於
var i, temp; // temp is "rval", which may not be an actual variable. i = 1;temp = i;i = i + 1;i = temp;
新闻热点
疑难解答