javascript 运算数的求值顺序

 更新时间:2011年08月23日 22:53:05   作者:  
请注意,这里说的是运算数的求值顺序。而非运算符,运算符的求值顺序我们比较熟悉。
比如
复制代码 代码如下:

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实现数组内值索引随机化及创建随机数组的方法

    这篇文章主要介绍了javascript实现数组内值索引随机化及创建随机数组的方法,涉及javascript数组索引及随机数的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • js带闹铃功能的倒计时代码

    js带闹铃功能的倒计时代码

    这篇文章主要为大家详细介绍了js带闹铃功能的倒计时代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 利用es6 new.target来对模拟抽象类的方法

    利用es6 new.target来对模拟抽象类的方法

    这篇文章主要介绍了利用es6 new.target来对模拟抽象类的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • JavaScript本地储存:localStorage、sessionStorage、cookie的使用

    JavaScript本地储存:localStorage、sessionStorage、cookie的使用

    这篇文章主要介绍了JavaScript本地储存:localStorage、sessionStorage、cookie的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • JavaScript中的数学运算介绍

    JavaScript中的数学运算介绍

    这篇文章主要介绍了JavaScript中的数学运算介绍,本文先是讲解了数学运算的一些知识,然后给出了操作实例,需要的朋友可以参考下
    2014-12-12
  • 小程序获取当前位置加搜索附近热门小区及商区的方法

    小程序获取当前位置加搜索附近热门小区及商区的方法

    这篇文章主要介绍了小程序获取当前位置加搜索附近热门小区及商区的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • TypeScript魔法堂之枚举的超实用手册

    TypeScript魔法堂之枚举的超实用手册

    这篇文章主要介绍了TypeScript魔法堂之枚举的超实用手册,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 微信小程序:报错(in promise) MiniProgramError

    微信小程序:报错(in promise) MiniProgramError

    这篇文章主要介绍了微信小程序:报错(in promise) MiniProgramError,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Bootstrap FileInput实现图片上传功能

    Bootstrap FileInput实现图片上传功能

    这篇文章主要为大家详细介绍了Bootstrap FileInput实现图片上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • 微信小程序switch组件使用详解

    微信小程序switch组件使用详解

    这篇文章主要为大家详细介绍了微信小程序switch组件的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论