javascript 運(yùn)算數(shù)的求值順序
更新時間:2011年08月23日 22:53:05 作者:
請注意,這里說的是運(yùn)算數(shù)的求值順序。而非運(yùn)算符,運(yùn)算符的求值順序我們比較熟悉。
比如
a * b + c;
,先算乘方,再算乘除,最后算加減
,有括號,先算括號里面的,同一級運(yùn)算按照從左到右的順序依次進(jìn)行
這一點(diǎn)所有的程序設(shè)計語言都采取數(shù)學(xué)中數(shù)字的計算順序。當(dāng)然程序設(shè)計語言中還有一些不同于數(shù)學(xué)中的運(yùn)算符。那運(yùn)算數(shù)的求值順序是如何的呢?
如下
// 求 a 和 b的和
sum = a + b;
,從內(nèi)存中取a的值
,從內(nèi)存中取b的值
,進(jìn)行相加運(yùn)算
貌似描述的很弱智,理所當(dāng)然就是這樣的。有人可能覺得先取b的值,再取a,然后相加。這樣最后的結(jié)果也是一樣的。的確是這樣。但如果運(yùn)算數(shù)是一個函數(shù)執(zhí)行呢?
sum = a + fun();
假設(shè)fun函數(shù)中僅return 一個數(shù)字。這時無論是先取a的值,再去fun執(zhí)行后的值也是無所謂的。最終的結(jié)果都一樣。說到這里,仍然沒有新鮮,糾結(jié)的地方。
但如果fun不僅返回了數(shù)字,還改變了a呢? 比如以下JavaScript代碼
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?
fun 函數(shù)不僅返回了20,還改變了a的值。而a 正是參與相加運(yùn)算的a。這時a取 5 還是 10 參與相加運(yùn)算呢? 如果是5則b的值為25,如果是10,則b為30。JavaScript語言中結(jié)果是25。但C語言中卻是30,如下
int a = 5;
int fun(){
a = 10;
return 20;
}
int b = a + fun(); // 30
因此,只有當(dāng)函數(shù)有副作用的時候,運(yùn)算數(shù)的求值順序不同會導(dǎo)致結(jié)果不同。很明顯,各個語言實(shí)現(xiàn)不同。
JavaScript語言中,從左到右,a取5,fun執(zhí)行后返回20,最后是 5+20。注意,雖然參與此次運(yùn)算時a取5,但a值實(shí)際上已經(jīng)改變了。如下
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?
alert(a); // 10
C語言中,先執(zhí)行fun,fun中改變了a的值,為10,取a為10參與本次 “加”運(yùn)算,fun返回20。結(jié)果是 10+20。
可以看到,無論是JavaScript還是C。a的值最后都改變了,為10。區(qū)別在于:參與相加運(yùn)算時,JavaScript 取未被改變的值5, C取改變了的值10。
C語言中,運(yùn)算也是從左到右的。但當(dāng)有函數(shù)作為運(yùn)算數(shù)時,會先執(zhí)行函數(shù)。而改函數(shù)如果有副作用時,取被改變后的a值參與本次運(yùn)算。無論fun和a的順序。如下將fun放在前面,在C語言中結(jié)果仍然是30
int a = 5;
int fun(){
a = 10;
return 20;
}
int b = fun() + a; // 30
JavaScript中如果fun與a交換了順序,則結(jié)果不是25了。
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = fun() + a; // b為30
相關(guān):
函數(shù)的副作用
復(fù)制代碼 代碼如下:
a * b + c;
,先算乘方,再算乘除,最后算加減
,有括號,先算括號里面的,同一級運(yùn)算按照從左到右的順序依次進(jìn)行
這一點(diǎn)所有的程序設(shè)計語言都采取數(shù)學(xué)中數(shù)字的計算順序。當(dāng)然程序設(shè)計語言中還有一些不同于數(shù)學(xué)中的運(yùn)算符。那運(yùn)算數(shù)的求值順序是如何的呢?
如下
復(fù)制代碼 代碼如下:
// 求 a 和 b的和
sum = a + b;
,從內(nèi)存中取a的值
,從內(nèi)存中取b的值
,進(jìn)行相加運(yùn)算
貌似描述的很弱智,理所當(dāng)然就是這樣的。有人可能覺得先取b的值,再取a,然后相加。這樣最后的結(jié)果也是一樣的。的確是這樣。但如果運(yùn)算數(shù)是一個函數(shù)執(zhí)行呢?
sum = a + fun();
假設(shè)fun函數(shù)中僅return 一個數(shù)字。這時無論是先取a的值,再去fun執(zhí)行后的值也是無所謂的。最終的結(jié)果都一樣。說到這里,仍然沒有新鮮,糾結(jié)的地方。
但如果fun不僅返回了數(shù)字,還改變了a呢? 比如以下JavaScript代碼
復(fù)制代碼 代碼如下:
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?
fun 函數(shù)不僅返回了20,還改變了a的值。而a 正是參與相加運(yùn)算的a。這時a取 5 還是 10 參與相加運(yùn)算呢? 如果是5則b的值為25,如果是10,則b為30。JavaScript語言中結(jié)果是25。但C語言中卻是30,如下
復(fù)制代碼 代碼如下:
int a = 5;
int fun(){
a = 10;
return 20;
}
int b = a + fun(); // 30
因此,只有當(dāng)函數(shù)有副作用的時候,運(yùn)算數(shù)的求值順序不同會導(dǎo)致結(jié)果不同。很明顯,各個語言實(shí)現(xiàn)不同。
JavaScript語言中,從左到右,a取5,fun執(zhí)行后返回20,最后是 5+20。注意,雖然參與此次運(yùn)算時a取5,但a值實(shí)際上已經(jīng)改變了。如下
復(fù)制代碼 代碼如下:
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?
alert(a); // 10
C語言中,先執(zhí)行fun,fun中改變了a的值,為10,取a為10參與本次 “加”運(yùn)算,fun返回20。結(jié)果是 10+20。
可以看到,無論是JavaScript還是C。a的值最后都改變了,為10。區(qū)別在于:參與相加運(yùn)算時,JavaScript 取未被改變的值5, C取改變了的值10。
C語言中,運(yùn)算也是從左到右的。但當(dāng)有函數(shù)作為運(yùn)算數(shù)時,會先執(zhí)行函數(shù)。而改函數(shù)如果有副作用時,取被改變后的a值參與本次運(yùn)算。無論fun和a的順序。如下將fun放在前面,在C語言中結(jié)果仍然是30
復(fù)制代碼 代碼如下:
int a = 5;
int fun(){
a = 10;
return 20;
}
int b = fun() + a; // 30
JavaScript中如果fun與a交換了順序,則結(jié)果不是25了。
復(fù)制代碼 代碼如下:
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = fun() + a; // b為30
相關(guān):
函數(shù)的副作用
您可能感興趣的文章:
- 深入理解JavaScript系列(19):求值策略(Evaluation strategy)詳解
- 編寫一個javascript元循環(huán)求值器的方法
- JavaScript惰性求值的一種實(shí)現(xiàn)方法示例
- JS實(shí)現(xiàn)可針對算術(shù)表達(dá)式求值的計算器功能示例
- JavaScript數(shù)據(jù)結(jié)構(gòu)中棧的應(yīng)用之表達(dá)式求值問題詳解
- JS閉包與延遲求值用法示例
- JavaScript+HTML實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
- JavaScript中的this指向問題詳解
- 帶你徹底理解JavaScript中的原型對象
- 詳細(xì)討論JavaScript中的求值策略
相關(guān)文章
javascript實(shí)現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)數(shù)組內(nèi)值索引隨機(jī)化及創(chuàng)建隨機(jī)數(shù)組的方法,涉及javascript數(shù)組索引及隨機(jī)數(shù)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08JavaScript本地儲存:localStorage、sessionStorage、cookie的使用
這篇文章主要介紹了JavaScript本地儲存:localStorage、sessionStorage、cookie的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10JavaScript中的數(shù)學(xué)運(yùn)算介紹
這篇文章主要介紹了JavaScript中的數(shù)學(xué)運(yùn)算介紹,本文先是講解了數(shù)學(xué)運(yùn)算的一些知識,然后給出了操作實(shí)例,需要的朋友可以參考下2014-12-12小程序獲取當(dāng)前位置加搜索附近熱門小區(qū)及商區(qū)的方法
這篇文章主要介紹了小程序獲取當(dāng)前位置加搜索附近熱門小區(qū)及商區(qū)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04微信小程序:報錯(in promise) MiniProgramError
這篇文章主要介紹了微信小程序:報錯(in promise) MiniProgramError,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Bootstrap FileInput實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了Bootstrap FileInput實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-01-01