javascript 运算数的求值顺序


Posted in Javascript onAugust 23, 2011

比如

a * b + c;

,先算乘方,再算乘除,最后算加减
,有括号,先算括号里面的,同一级运算按照从左到右的顺序依次进行
这一点所有的程序设计语言都采取数学中数字的计算顺序。当然程序设计语言中还有一些不同于数学中的运算符。那运算数的求值顺序是如何的呢?
如下
// 求 a 和 b的和 
sum = a + b;

,从内存中取a的值
,从内存中取b的值
,进行相加运算
貌似描述的很弱智,理所当然就是这样的。有人可能觉得先取b的值,再取a,然后相加。这样最后的结果也是一样的。的确是这样。但如果运算数是一个函数执行呢?
sum = a + fun();
假设fun函数中仅return 一个数字。这时无论是先取a的值,再去fun执行后的值也是无所谓的。最终的结果都一样。说到这里,仍然没有新鲜,纠结的地方。
但如果fun不仅返回了数字,还改变了a呢? 比如以下JavaScript代码
var a = 5; 
function fun(){ 
a = 10; 
return 20; 
} 
var b = a + fun(); // b 的值?

fun 函数不仅返回了20,还改变了a的值。而a 正是参与相加运算的a。这时a取 5 还是 10 参与相加运算呢? 如果是5则b的值为25,如果是10,则b为30。JavaScript语言中结果是25。但C语言中却是30,如下
int a = 5; 
int fun(){ 
a = 10; 
return 20; 
} 
int b = a + fun(); // 30

因此,只有当函数有副作用的时候,运算数的求值顺序不同会导致结果不同。很明显,各个语言实现不同。
JavaScript语言中,从左到右,a取5,fun执行后返回20,最后是 5+20。注意,虽然参与此次运算时a取5,但a值实际上已经改变了。如下
var a = 5; 
function fun(){ 
a = 10; 
return 20; 
} 
var b = a + fun(); // b 的值? 
alert(a); // 10

C语言中,先执行fun,fun中改变了a的值,为10,取a为10参与本次 “加”运算,fun返回20。结果是 10+20。
可以看到,无论是JavaScript还是C。a的值最后都改变了,为10。区别在于:参与相加运算时,JavaScript 取未被改变的值5, C取改变了的值10。
C语言中,运算也是从左到右的。但当有函数作为运算数时,会先执行函数。而改函数如果有副作用时,取被改变后的a值参与本次运算。无论fun和a的顺序。如下将fun放在前面,在C语言中结果仍然是30
int a = 5; 
int fun(){ 
a = 10; 
return 20; 
} 
int b = fun() + a; // 30

JavaScript中如果fun与a交换了顺序,则结果不是25了。
var a = 5; 
function fun(){ 
a = 10; 
return 20; 
} 
var b = fun() + a; // b为30

相关:
函数的副作用
Javascript 相关文章推荐
jQuery EasyUI NumberBox(数字框)的用法
Jul 08 Javascript
基于jQuery的动态表格插件
Mar 28 Javascript
js关闭模态窗口刷新父页面或跳转页面
Dec 13 Javascript
关闭ie窗口清除Session的解决方法
Jan 10 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
Aug 18 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
Aug 24 Javascript
浅析JS运动
Dec 28 Javascript
基于JavaScript实现类似于百度学术高级检索功能
Mar 02 Javascript
超全面的javascript中变量命名规则
Feb 09 Javascript
layer.close()关闭进度条和Iframe窗的方法
Aug 17 Javascript
JS集合set类的实现与使用方法示例
Feb 01 Javascript
vuex 中插件的编写案例解析
Jun 10 Javascript
读jQuery之十四 (触发事件核心方法)
Aug 23 #Javascript
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 #Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
Aug 23 #Javascript
jquery 回车事件实现代码
Aug 23 #Javascript
基于jquery的大众点评,分类导航实现代码
Aug 23 #Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
Aug 23 #Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
Aug 23 #Javascript
You might like
php SQL防注入代码集合
2008/04/25 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
jQuery插件制作的实例教程
2016/05/16 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
Python: 传递列表副本方式
2019/12/19 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
Python多线程多进程实例对比解析
2020/03/12 Python
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
大二学生学年自我鉴定
2014/09/12 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
同学聚会致辞集锦
2015/07/28 职场文书