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查找法实现当前栏目的高亮显示的代码
Nov 24 Javascript
JQuery实现自定义对话框的代码
Jun 15 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
Dec 06 Javascript
用jquery生成二级菜单的实例代码
Jun 24 Javascript
JavaScript实现格式化字符串函数String.format
Dec 16 Javascript
浅谈JavaScript中promise的使用
Jan 11 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
Apr 17 Javascript
ES6正则表达式扩展笔记
Jul 25 Javascript
JavaScript中如何判断一个值的类型
Sep 15 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
Sep 20 Javascript
vue实现打印功能的两种方法
Sep 07 Javascript
详解滑动穿透(锁body)终极探索
Apr 16 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实例
2013/12/24 PHP
PHP里的单例类写法实例
2015/06/25 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
JS判断元素为数字的奇异写法分享
2012/08/01 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
浅谈$('div a') 与$('div>a')的区别
2016/07/18 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
vue调用本地摄像头实现拍照功能
2020/08/14 Javascript
浅谈对yield的初步理解
2017/05/29 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
医学生实习自我鉴定
2013/09/27 职场文书
美国留学经济担保书
2014/05/20 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
党支部书记岗位职责
2015/02/15 职场文书
Go timer如何调度
2021/06/09 Golang