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 相关文章推荐
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
jQuery实现原理的模拟代码 -6 代码下载
Aug 16 Javascript
理解Javascript_12_执行模型浅析
Oct 18 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
Jan 09 Javascript
jquery.validate使用详解
Jun 02 Javascript
解析微信JS-SDK配置授权,实现分享接口
Dec 09 Javascript
AngularJS之自定义服务详解(factory、service、provider)
Apr 14 Javascript
详解ECMAScript6入门--Class对象
Apr 27 Javascript
详解angular脏检查原理及伪代码实现
Jun 08 Javascript
opencv 识别微信登录验证滑动块位置
Aug 07 Javascript
JS数组的常用10种方法详解
May 08 Javascript
浅谈Ant Design Pro 菜单自定义 icon
Nov 17 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配置文件中最常用四个ini函数
2007/03/19 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
offsetParent 算法分析
2010/04/05 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
Python 中迭代器与生成器实例详解
2017/03/29 Python
使用C++扩展Python的功能详解
2018/01/12 Python
python模拟表单提交登录图书馆
2018/04/27 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
python实现猜数字游戏
2020/03/25 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
Python中过滤字符串列表的方法
2020/12/22 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
毕业生怎样写好自荐信
2013/11/11 职场文书
学前班教师的自我鉴定
2013/12/05 职场文书
安全负责人任命书
2014/06/06 职场文书
住房租房协议书
2014/08/20 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书