JS逗號運算符的用法詳解

逗號運算符的用法詳解

注意:
一、由於目前正在功讀JavaScript技術,所以這裏拿JavaScript爲例。你可以自己在PHP中試試。
二、JavaScript語法比較複雜,因此拿JavaScript做舉例。


最近重新閱讀JavaScript權威指南這本書,應該說很認真的閱讀,於是便想把所學的東西多記錄下來。後

面本人將逐步寫上更多關於本書的文章。

本文的理論知識來自於JavaScript權威指南,我這裏做一下整理,或者說叫筆記。

如果你的基礎夠好的話,完全理解不成問題,但是如果讀得有些鬱悶的話,可以加我的QQ:76863715


閱讀本文的前提是,你能區分什麼是表達式,什麼是語句。還有明確運算符和運算數多是些啥東西。所

謂的表達式就是—— 一個JavaScript的“短語“,JavaScript的解釋器可以計算它,從而生成一個值。表達式可

以分爲以下三種:

1)直接量,如1.7是數字直接量、"JavaScript權威指南"是一個字符串直接量等。
2) 變量

直接量表達式的值就是這個直接量本身,變量表達式的值則是該變量所存放或引用的值。

3) 可以“合併”上面提到的“簡單”表達式來創建爲比較複雜的表達式。例如1.7是表達式,i也是表達式,下面的代碼所示的同樣也是(也可以叫)表達式:
i + 1.7
上面這個表達式的值是兩個簡單表達式(一個變量表達式和一個簡單表達式)的和。在此例中,“+”是一個運算符,用於將兩個簡單表達式合併起來以組成一個複雜的表達式。

運算數的個數
可以根據運算符需要的運算數的個數對運算符進行分類,大多數運算符都是二元運算符,它們把兩個“表達式”合併成一個複雜的表達式。簡而言之,就是它有兩個運算數。此外,JavaScript還支持大量的一元運算符,它能將一個表達式轉換成另一個更復雜的表達式。如表達式-3中,運算符“-”就是一元運算符,它執行操作是對運算數取反。
JavaScript還支持三元操作符“?:”,它可以將三個表達式合併爲一個複雜的表達式。

OK,下面開始講解逗號運算符。

逗號運算符,它將先計算左邊的參數,再計算右邊的參數值。然後返回最右邊參數的值。
原書舉的例子不太好,無法解釋上面那句話,這裏另外提供一個:

<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的值是函數CommaTest返回的值,而a和b多加1了。

逗號運算符和函數調用運算符的衝突
在JavaScript中,函數調用確實是函數調用運算符。它很特殊,因爲其它編程語言資料中多從來沒有這個叫法的。然後,(纔是)它沒有固定數目的運算數。

函數調用運算符的第一個參數是一個函數名或者是一個引用函數的表達式,其後是括號()。括號中間可以是數目不定的運算符,這些運算數可以是任意的表達式,它們之間用逗號隔開。

函數調用運算符將計算它的每一個運算數,第一個運算數指定爲函數名(括號前),而括號中間的所有運算數的值將傳遞給這個函數作爲函數的參數。
例如:

document.close()
Math.sin(x)
alert("Welcome " + name)
Date.UTC(2000, 11, 31, 23, 59, 59)
funcs.f(funcs.args[0], funcs.args[1])

知道了調用函數運算符後,我們舉個例子說明關於如何處理它們衝突的事。

<script>
alert(2*5, 2*4); // 輸出10
</script>

上面這段代碼輸出10,但是如果根據逗號運算符的原理來解釋的話,那應該是輸出8纔對。爲什麼呢?

因爲逗號運算符在JavaScript在的優先級是最底的,記住這一點非常有用。所以函數調用運算符將先於逗號運算符運行。結果alert函數輸出第一個參數的值。將上面的代碼修改成如下所示即可。

<script>
alert((2*5, 2*4)); // 返回8
</script>


逗號運算符和賦值運算賦的衝突

在JavaScript中,逗號運算符的優先級比賦值運算符還要底。請看下面的代碼。

<script>
var a = 20;
var b = ++a,10;
alert(b);
</script>

這段代碼似乎不能運行,可能是由於賦值運算符優先於逗號表達式運行,如果將代碼改成

<script>
var a = 20;
var b = (++a,10);
alert(b);
</script>

即可了。



上面說到的“可能”我們這裏做一下解釋,這是本人的一些看法,不一定權威。

逗號運算符要求它的運算數是一個複雜的表達式或簡單的表達式(如變量或直接量),但由於賦值運算符優先於逗號運算符執行,因此變成左邊不是一個運算數或一個表達式,而是一個含有var關鍵字的語句

之前不能執行的代碼可以看成如下代碼:

<script>
var a = 20;
(var b = ++a),10;
alert(b);
</script>

語句中有表達式語句,但不是所有的語句都是表達式。

############################################################

一、逗號運算符的特性及作用 
逗號運算符的作用是將若干表達式連接起來。它的優先級別在所有運算符中是最低的,結合方向是"自左至右"的。 
如:3*3,4*4 
二、逗號表達式 
逗號表達式的一般形式是:表達式1,表達式2,表達式3……表達式n 
逗號表達式的求解過程是:先計算表達式1的值,再計算表達式2的值,……一直計算到表達式n的值。最後整個逗號表達式的值是表達式n的值。 
看下面幾個例子: 
x=8*2,x*4 /*整個表達式的值爲64,x的值爲16*/ 
(x=8*2,x*4),x*2 /*整個表達式的值爲128,x的值爲16*/ 
x=(z=5,5*2) /*整個表達式爲賦值表達式,它的值爲10,z的值爲5*/ 
x=z=5,5*2 /*整個表達式爲逗號表達式,它的值爲10,x和z的值都爲5*/ 
逗號表達式用的地方不太多,一般情況是在給循環變量賦初值時才用得到。所以程序中並不是所有的逗號都要看成逗號運算符,尤其是在函數調用時,各個參數是用逗號隔開的,這時逗號就不是逗號運算符。 
如:printf("%d,%d,%d",x,y,z); ########################################################### 運算符使它兩邊的表達式以從左到右的順序被執行,並獲得右邊表達式的值。, 運算符最普通的用途是在 for 循環的遞增表達式中使用。例如: 

for (i = 0; i < 10; i++, j++)
{
k = i + j;
}
每次通過循環的末端時, for 語句只允許單個表達式被執行。, 運算符被用來允許多個表達式被當作單個表達式,從而規避該限制。
發佈了6 篇原創文章 · 獲贊 6 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章