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 相关文章推荐
js本身的局限性 别让javascript做太多事
Mar 23 Javascript
JS中Iframe之间传值及子页面与父页面应用
Mar 11 Javascript
JavaScript定时器详解及实例
Aug 01 Javascript
jquery删除提示框弹出是否删除对话框
Jan 07 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
Javascript 闭包详解及实例代码
Nov 30 Javascript
在Vue中如何使用Cookie操作实例
Jul 27 Javascript
jQuery插件Validation表单验证详解
May 26 jQuery
vue 国际化 vue-i18n 双语言 语言包
Jun 07 Javascript
js实现简单模态框实例
Nov 16 Javascript
js实现全选和全不选
Jul 28 Javascript
vue编写简单的购物车功能
Jan 08 Vue.js
读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
Laravel 5框架学习之环境与配置
2015/04/08 PHP
为你总结一些php信息函数
2015/10/21 PHP
PHP goto语句用法实例
2019/08/06 PHP
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
Python使用wxPython实现计算器
2018/01/30 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
Python定义函数实现累计求和操作
2020/05/03 Python
matplotlib对象拾取事件处理的实现
2021/01/14 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
JPA面试常见问题
2016/11/14 面试题
智能电子应届生求职信
2013/11/10 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
市场部经理岗位职责
2015/02/02 职场文书
英文产品推荐信
2015/03/27 职场文书
公司人事任命通知
2015/04/20 职场文书