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 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
May 08 Javascript
jQuery select控制插件
Aug 17 Javascript
jquery的index方法实现tab效果
Feb 16 Javascript
怎么引入(调用)一个JS文件
May 26 Javascript
浅谈js的html元素的父节点,子节点
Aug 06 Javascript
原生javascript实现文件异步上传的实例讲解
Oct 26 Javascript
vue实现form表单与table表格的数据关联功能示例
Jan 29 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
May 07 Javascript
Vue vm.$attrs使用场景详解
Mar 08 Javascript
使用js获取身份证年龄的示例代码
Dec 11 Javascript
angular异步验证器防抖实例详解
Mar 31 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_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
php实用代码片段整理
2016/11/12 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
javascript读取xml
2006/11/04 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
webpack构建的详细流程探底
2018/01/08 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
Python实现的金山快盘的签到程序
2013/01/17 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
python模块smtplib学习
2018/05/22 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
基于Python的OCR实现示例
2020/04/03 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
自荐书格式
2013/12/01 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
收款授权委托书
2014/10/02 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
Elasticsearch 索引操作和增删改查
2022/04/19 Python