淺談JS中逗號運(yùn)算符的用法
注意:
一、由于目前正在功讀JavaScript技術(shù),所以這里拿JavaScript為例。你可以自己在PHP中試試。
二、JavaScript語法比較復(fù)雜,因此拿JavaScript做舉例。
最近重新閱讀JavaScript權(quán)威指南這本書,應(yīng)該說很認(rèn)真的閱讀,于是便想把所學(xué)的東西多記錄下來。后
面本人將逐步寫上更多關(guān)于本書的文章。
本文的理論知識來自于JavaScript權(quán)威指南,我這里做一下整理,或者說叫筆記。
如果你的基礎(chǔ)夠好的話,完全理解不成問題,但是如果讀得有些郁悶的話,可以加我的QQ:76863715
閱讀本文的前提是,你能區(qū)分什么是表達(dá)式,什么是語句。還有明確運(yùn)算符和運(yùn)算數(shù)多是些啥東西。所
謂的表達(dá)式就是—— 一個(gè)JavaScript的“短語“,JavaScript的解釋器可以計(jì)算它,從而生成一個(gè)值。表達(dá)式可
以分為以下三種:
1)直接量,如1.7是數(shù)字直接量、"JavaScript權(quán)威指南"是一個(gè)字符串直接量等。
2) 變量
直接量表達(dá)式的值就是這個(gè)直接量本身,變量表達(dá)式的值則是該變量所存放或引用的值。
3) 可以“合并”上面提到的“簡單”表達(dá)式來創(chuàng)建為比較復(fù)雜的表達(dá)式。例如1.7是表達(dá)式,i也是表達(dá)式,下面的代碼所示的同樣也是(也可以叫)表達(dá)式:
i + 1.7
上面這個(gè)表達(dá)式的值是兩個(gè)簡單表達(dá)式(一個(gè)變量表達(dá)式和一個(gè)簡單表達(dá)式)的和。在此例中,“+”是一個(gè)運(yùn)算符,用于將兩個(gè)簡單表達(dá)式合并起來以組成一個(gè)復(fù)雜的表達(dá)式。
運(yùn)算數(shù)的個(gè)數(shù)
可 以根據(jù)運(yùn)算符需要的運(yùn)算數(shù)的個(gè)數(shù)對運(yùn)算符進(jìn)行分類,大多數(shù)運(yùn)算符都是二元運(yùn)算符,它們把兩個(gè)“表達(dá)式”合并成一個(gè)復(fù)雜的表達(dá)式。簡而言之,就是它有兩個(gè)運(yùn) 算數(shù)。此外,JavaScript還支持大量的一元運(yùn)算符,它能將一個(gè)表達(dá)式轉(zhuǎn)換成另一個(gè)更復(fù)雜的表達(dá)式。如表達(dá)式-3中,運(yùn)算符“-”就是一元運(yùn)算符, 它執(zhí)行操作是對運(yùn)算數(shù)取反。
JavaScript還支持三元操作符“?:”,它可以將三個(gè)表達(dá)式合并為一個(gè)復(fù)雜的表達(dá)式。
OK,下面開始講解逗號運(yùn)算符。
逗號運(yùn)算符,它將先計(jì)算左邊的參數(shù),再計(jì)算右邊的參數(shù)值。然后返回最右邊參數(shù)的值。
原書舉的例子不太好,無法解釋上面那句話,這里另外提供一個(gè):
<script> var a = 10, b = 20; function CommaTest(){ return a++, b++, 10; } var c = CommaTest(); alert(a); // 返回11 alert(b); // 返回21 alert(c); // 返回10 </script>
變量c的值是函數(shù)CommaTest返回的值,而a和b多加1了。
逗號運(yùn)算符和函數(shù)調(diào)用運(yùn)算符的沖突
在JavaScript中,函數(shù)調(diào)用確實(shí)是函數(shù)調(diào)用運(yùn)算符。它很特殊,因?yàn)槠渌幊陶Z言資料中多從來沒有這個(gè)叫法的。然后,(才是)它沒有固定數(shù)目的運(yùn)算數(shù)。
函數(shù)調(diào)用運(yùn)算符的第一個(gè)參數(shù)是一個(gè)函數(shù)名或者是一個(gè)引用函數(shù)的表達(dá)式,其后是括號()。括號中間可以是數(shù)目不定的運(yùn)算符,這些運(yùn)算數(shù)可以是任意的表達(dá)式,它們之間用逗號隔開。
函數(shù)調(diào)用運(yùn)算符將計(jì)算它的每一個(gè)運(yùn)算數(shù),第一個(gè)運(yùn)算數(shù)指定為函數(shù)名(括號前),而括號中間的所有運(yùn)算數(shù)的值將傳遞給這個(gè)函數(shù)作為函數(shù)的參數(shù)。
例如:
document.close() Math.sin(x) alert("Welcome " + name) Date.UTC(2000, 11, 31, 23, 59, 59) funcs.f(funcs.args[0], funcs.args[1])
知道了調(diào)用函數(shù)運(yùn)算符后,我們舉個(gè)例子說明關(guān)于如何處理它們沖突的事。
<script> alert(2*5, 2*4); // 輸出10 </script>
上面這段代碼輸出10,但是如果根據(jù)逗號運(yùn)算符的原理來解釋的話,那應(yīng)該是輸出8才對。為什么呢?
因?yàn)槎禾栠\(yùn)算符在JavaScript在的優(yōu)先級是最底的,記住這一點(diǎn)非常有用。所以函數(shù)調(diào)用運(yùn)算符將先于逗號運(yùn)算符運(yùn)行。結(jié)果alert函數(shù)輸出第一個(gè)參數(shù)的值。將上面的代碼修改成如下所示即可。
<script> alert((2*5, 2*4)); // 返回8 </script>
逗號運(yùn)算符和賦值運(yùn)算賦的沖突
在JavaScript中,逗號運(yùn)算符的優(yōu)先級比賦值運(yùn)算符還要底。請看下面的代碼。
<script> var a = 20; var b = ++a,10; alert(b); </script>
這段代碼似乎不能運(yùn)行,可能是由于賦值運(yùn)算符優(yōu)先于逗號表達(dá)式運(yùn)行,如果將代碼改成
<script> var a = 20; var b = (++a,10); alert(b); </script>
即可了。
上面說到的“可能”我們這里做一下解釋,這是本人的一些看法,不一定權(quán)威。
逗號運(yùn)算符要求它的運(yùn)算數(shù)是一個(gè)復(fù)雜的表達(dá)式或簡單的表達(dá)式(如變量或直接量),但由于賦值運(yùn)算符優(yōu)先于逗號運(yùn)算符執(zhí)行,因此變成左邊不是一個(gè)運(yùn)算數(shù)或一個(gè)表達(dá)式,而是一個(gè)含有var關(guān)鍵字的語句
之前不能執(zhí)行的代碼可以看成如下代碼:
<script> var a = 20; (var b = ++a),10; alert(b); </script>
語句中有表達(dá)式語句,但不是所有的語句都是表達(dá)式。
#################################################
一、逗號運(yùn)算符的特性及作用
逗號運(yùn)算符的作用是將若干表達(dá)式連接起來。它的優(yōu)先級別在所有運(yùn)算符中是最低的,結(jié)合方向是"自左至右"的。
如:3*3,4*4
二、逗號表達(dá)式
逗號表達(dá)式的一般形式是:表達(dá)式1,表達(dá)式2,表達(dá)式3……表達(dá)式n
逗號表達(dá)式的求解過程是:先計(jì)算表達(dá)式1的值,再計(jì)算表達(dá)式2的值,……一直計(jì)算到表達(dá)式n的值。最后整個(gè)逗號表達(dá)式的值是表達(dá)式n的值。
看下面幾個(gè)例子:
x=8*2,x*4 /*整個(gè)表達(dá)式的值為64,x的值為16*/
(x=8*2,x*4),x*2 /*整個(gè)表達(dá)式的值為128,x的值為16*/
x=(z=5,5*2) /*整個(gè)表達(dá)式為賦值表達(dá)式,它的值為10,z的值為5*/
x=z=5,5*2 /*整個(gè)表達(dá)式為逗號表達(dá)式,它的值為10,x和z的值都為5*/
逗號表達(dá)式用的地方不太多,一般情況是在給循環(huán)變量賦初值時(shí)才用得到。所以程序中并不是所有的逗號都要看成逗號運(yùn)算符,尤其是在函數(shù)調(diào)用時(shí),各個(gè)參數(shù)是用逗號隔開的,這時(shí)逗號就不是逗號運(yùn)算符。
如:printf(" %d,%d,%d",x,y,z);
###################################################
運(yùn)算符使它兩邊的表達(dá)式以從左到右的順序被執(zhí)行,并獲得右邊表達(dá)式的值。, 運(yùn)算符最普通的用途是在 for 循環(huán)的遞增表達(dá)式中使用。例如:
for (i = 0; i < 10; i++, j++) { k = i + j; }
每次通過循環(huán)的末端時(shí), for 語句只允許單個(gè)表達(dá)式被執(zhí)行。, 運(yùn)算符被用來允許多個(gè)表達(dá)式被當(dāng)作單個(gè)表達(dá)式,從而規(guī)避該限制。
以上這篇淺談JS中逗號運(yùn)算符的用法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
.net JS模擬Repeater控件的實(shí)現(xiàn)代碼
一個(gè)模板控件規(guī)定了它的模板語法和js api,這是一個(gè)repeater控件的JS實(shí)現(xiàn):2013-06-06基于JavaScript實(shí)現(xiàn)焦點(diǎn)圖輪播效果
這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)焦點(diǎn)圖輪播效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03javascript實(shí)現(xiàn)跳轉(zhuǎn)菜單的具體方法
這篇文章介紹了javascript實(shí)現(xiàn)跳轉(zhuǎn)菜單的具體方法,有需要的朋友可以參考一下2013-07-07JavaScript實(shí)現(xiàn)給定時(shí)間相加天數(shù)的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)給定時(shí)間相加天數(shù)的方法,涉及JavaScript針對日期與時(shí)間操作相關(guān)技巧,需要的朋友可以參考下2016-01-01javascript宿主對象之window.navigator詳解
這篇文章主要為大家詳細(xì)介紹了javascript宿主對象之window.navigator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09