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 相关文章推荐
Wordpress ThickBox 点击图片显示下一张图的修改方法
Dec 11 Javascript
扩展JS Date对象时间格式化功能的小例子
Dec 02 Javascript
node.js中的fs.fchown方法使用说明
Dec 16 Javascript
js实现仿qq消息的弹出窗效果
Jan 06 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
Dec 24 Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 Javascript
配置eslint规范项目代码风格
Mar 11 Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 Javascript
jQuery实现全选、反选和不选功能的方法详解
Dec 04 jQuery
JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】
Apr 28 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
Sep 04 Javascript
JavaScript 生成唯一ID的几种方式
Feb 19 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
python opencv进行图像拼接
2020/03/27 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
外贸业务员求职信范文
2013/12/12 职场文书
公司活动邀请函
2014/01/24 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
党员入党表决心的话
2014/03/11 职场文书
校长寄语大全
2014/04/09 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
教你怎么用Python监控愉客行车程
2021/04/29 Python
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
python+opencv实现视频抽帧示例代码
2021/06/11 Python
python 远程执行命令的详细代码
2022/02/15 Python
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL