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里的条件判断
Feb 27 Javascript
js创建对象的几种常用方式小结(推荐)
Oct 24 Javascript
jQuery中map()方法用法实例
Jan 06 Javascript
js实现可折叠展开的手风琴菜单效果
Sep 07 Javascript
JavaScript脚本判断蜘蛛来源的方法
Sep 22 Javascript
jQuery实现手机自定义弹出输入框
Jun 13 Javascript
JavaScript 数组- Array的方法总结(推荐)
Jul 21 Javascript
jQuery与JavaScript节点创建方法的对比
Nov 18 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
Feb 13 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 jQuery
vue实现分页栏效果
Jun 28 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 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 时间计算问题小结
2009/01/04 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
Vue实现简单分页器
2018/12/29 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
Python安装第三方库的3种方法
2015/06/21 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
python取余运算符知识点详解
2019/06/27 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
Python yield的用法实例分析
2020/03/06 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
啤酒销售实习自我鉴定
2013/09/24 职场文书
积极贯彻学习两会精神总结
2014/03/17 职场文书
个人委托书格式
2014/04/04 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL