码迷,mamicode.com
首页 > 其他好文 > 详细

笔记-赋值与运算的顺序

时间:2015-07-10 23:33:11      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

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 rref
be the result of evaluating AssignmentExpression. Let rval be
GetValue(rref).
 Throw a SyntaxError exception if the following
conditions are all true: Type(lref) is Reference is true
IsStrictReference(lref) is true Type(GetBase(lref)) is Environment
Record GetReferencedName(lref) is either "eval" or "arguments" Call
PutValue(lref, rval).
 Return rval. NOTE When an assignment occurs
within strict mode code, its LeftHandSide must not evaluate to an
unresolvable reference. If it does a ReferenceError exception is
thrown upon assignment. The LeftHandSide also may not be a reference
to a data property with the attribute value {[[Writable]]:false}, to
an accessor property with the attribute value {[[Set]]:undefined}, nor
to a non-existent property of an object whose [[Extensible]] internal
property has the value false. In these cases a TypeError exception is
thrown.

注意這兩句:

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;

笔记-赋值与运算的顺序

标签:

原文地址:http://www.cnblogs.com/xd1024/p/4637649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!