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 相关文章推荐
javascript显示选择目录对话框的代码
Nov 10 Javascript
js+html+css实现鼠标移动div实例
Jan 30 Javascript
JavaScript中的parse()方法使用简介
Jun 12 Javascript
Jquery Easyui表单组件Form使用详解(30)
Dec 19 Javascript
react实现pure render时bind(this)隐患需注意!
Mar 09 Javascript
vue 路由嵌套高亮问题的解决方法
May 17 Javascript
JS无限级导航菜单实现方法
Jan 05 Javascript
React中使用外部样式的3种方式(小结)
May 28 Javascript
微信小程序实现Swiper轮播图效果
Nov 22 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
Jul 21 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 Javascript
vue3.0中友好使用antdv示例详解
Jan 05 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
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
python标准日志模块logging的使用方法
2013/11/01 Python
Python内置数据类型详解
2014/08/18 Python
python中的计时器timeit的使用方法
2017/10/20 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
python+django+rest框架配置创建方法
2019/08/31 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Python作用域与名字空间原理详解
2020/03/21 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
环境科学专业个人求职的自我评价
2013/11/28 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
学习心得体会
2019/06/20 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
Python Pygame实战之塔防游戏的实现
2022/03/17 Python
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL