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函数库整理
Aug 14 Javascript
Jquery异步请求数据实例代码
Dec 28 Javascript
js获取IP地址的方法小结
Jul 01 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
Mar 05 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
Sep 01 Javascript
微信小程序request请求后台接口php的实例详解
Sep 20 Javascript
利用10行js代码实现上下滚动公告效果
Dec 08 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
微信小程序开发搜索功能实现(前端+后端+数据库)
Mar 04 Javascript
Javascript查看大图功能代码实现
May 07 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
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
Sanic框架蓝图用法实例分析
2018/07/17 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
盛大笔试题
2016/11/05 面试题
《骑牛比赛》教后反思
2014/04/22 职场文书
服务承诺书格式
2014/05/21 职场文书
社区端午节活动总结
2015/02/11 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
三下乡活动心得体会
2016/01/23 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫