Fdream's Blog
专注于WEB前端开发
Powered by Google

关于Math.PI、前自增和后自增

22 晴天 2009-5
Fdream 发表于 Ajax Web, 已被阅读 1005 次, 评论 1 条
关键词:javascript
[ 阅读字体大小: ]

有这么一个题目,说bt其实也不bt,为了重点突出其中的意图,特意加上了括号:

参考代码: [复制代码] [保存代码]

var a = (++Math.PI);
var b = (Math.PI++);
var c = Math.PI = (++Math.PI);
var d = Math.PI = (Math.PI++);
var e = Math.PI = (Math.PI + 1);

执行完后,a、b、c、d、e的值分别是什么呢?如果学校里学的C语言基础好的话,应该可以知道答案。你不妨先写下答案,我们再来看看ECMA的规范。

在ECMA-262中,对于Math.PI的说明是这样的:

引用内容:

15.8.1.6

The number value for π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.

This property has the attributes { DontEnum, DontDelete, ReadOnly }.

很清楚,ReadOnly,那么你给Math.PI赋值是没有用的。

再看看关于前自增(Prefix Increment):

引用内容:

11.4.4 Prefix Increment Operator

The production UnaryExpression : ++ UnaryExpression is evaluated as follows:

1. Evaluate UnaryExpression.

2. Call GetValue(Result(1)).

3. Call ToNumber(Result(2)).

4. Add the value 1 to Result(3), using the same rules as for the + operator (see 11.6.3).

5. Call PutValue(Result(1), Result(4)).

6. Return Result(4).

注意,前自增返回的是第四步的结果,也就是自增1以后的值。因此,对于a来说,就是先取Math.PI的值,然后转化为Number,然后加1,返回的就是Math.PI的值加1以后的结果。因此,a是4.141592653589793.

再看看关于后缀自增(Prefix Increment):

引用内容:

11.3.1 Postfix Increment Operator

The production PostfixExpression : LeftHandSideExpression [no LineTerminator here] ++ is evaluated as follows:

1. Evaluate LeftHandSideExpression.

2. Call GetValue(Result(1)).

3. Call ToNumber(Result(2)).

4. Add the value 1 to Result(3), using the same rules as for the + operator (see 11.6.3).

5. Call PutValue(Result(1), Result(4)).

6. Return Result(3).

和上面的不同,返回第三步的结果,即没有自增之前的结果,因此返回3.141592653589793.

再来看看两个连续赋值的三个表达式,由于赋值运算是右结合运算,因此这三个表达式相当于:

参考代码: [复制代码] [保存代码]

var c = (Math.PI = (++Math.PI));
var d = (Math.PI = (Math.PI++));
var e = (Math.PI = (Math.PI + 1));

而对于赋值运算,在ECMA-262中是这样描述的:

引用内容:

11.13.1 Simple Assignment ( = )

The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:

1. Evaluate LeftHandSideExpression.

2. Evaluate AssignmentExpression.

3. Call GetValue(Result(2)).

4. Call PutValue(Result(1), Result(3)).

5. Return Result(3).

赋值后,返回第三步的结果,即语句右边的表达式的结果。因此,这里c、d、e的结果就很明显了:

参考代码: [复制代码] [保存代码]

c = 4.141592653589793;
d = 3.141592653589793;
e = 4.141592653589793;

这里还要注意一点什么?a++ 和 a=a+1 不一样~

Related articles 您可能对这些文章也感兴趣:
Related comments 与该文相关的评论:(我也想说几句)
引用这个评论  A客网 于 6/30/2009 7:55:38 PM 发表评论: 

学习了.....还怎么注意这个.

文章转载至A客网(51as.com)AS分类

学习了.....还怎么注意这个. 文章转载至A客网(51as.com)AS分类
Add a comment 我来说两句: 
禁止表情
禁止UBB
禁止图片
识别链接
识别关键字
表  情
arrow
用户名:   密码:  (匿名可不写) 同时注册?
验证码:   看不清?换个图片  看不清楚?换个图片

 
Copyright © 2005-2008,Fdream All Rights Reserved
Processed in 0.0625008 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号