javascript 运算数的求值顺序 |
本文标签:运算数,求值顺序 比如 复制代码 代码如下: 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 相关: 函数的副作用 |