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中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
jQuery实现切换页面过渡动画效果
Oct 29 Javascript
为何JS操作的href都是javascript:void(0);呢
Nov 12 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
ajax接收后台数据在html页面显示
Feb 19 Javascript
如何使用Bootstrap 按钮实例详解
Mar 29 Javascript
微信小程序实现自定义modal弹窗封装的方法
Jun 15 Javascript
浅谈Angular单元测试总结
Mar 22 Javascript
Vue 处理表单input单行文本框的实例代码
May 09 Javascript
微信小程序云开发如何使用npm安装依赖
May 18 Javascript
JavaScript命名空间模式实例详解
Jun 20 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
Mysql的常用命令
2006/10/09 PHP
php实现可逆加密的方法
2015/08/11 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
5分钟理解JavaScript中this用法分享
2013/11/09 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
Python isinstance判断对象类型
2008/09/06 Python
python实现给字典添加条目的方法
2014/09/25 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python实现最大优先队列
2019/08/29 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
几个人围成一圈的问题
2013/09/26 面试题
《藏戏》教学反思
2014/02/11 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL