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 获取今天以及过去日期
Apr 11 Javascript
backbone简介_动力节点Java学院整理
Jul 14 Javascript
Angular2学习笔记之数据绑定的示例代码
Jan 03 Javascript
在vue组件中使用axios的方法
Mar 16 Javascript
nuxt.js 缓存实践
Jun 25 Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 Javascript
微信小程序实现选项卡效果
Nov 06 Javascript
微信小程序上传多图到服务器并获取返回的路径
May 05 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
vue实现瀑布流组件滑动加载更多
Mar 10 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
May 16 Javascript
electron踩坑之remote of undefined的解决
Oct 06 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中soap的用法实例
2014/10/24 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
python实现自动重启本程序的方法
2015/07/09 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
土木工程应届生自荐信
2013/09/24 职场文书
怎么写好自荐信
2013/10/30 职场文书
总监职责范文
2013/11/09 职场文书
优秀求职信范文分享
2013/12/19 职场文书
高中政治教学反思
2014/01/18 职场文书
幼儿园五一活动方案
2014/02/07 职场文书
股东授权委托书范文
2014/09/13 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL