逗號運算符,它將先計算左邊的參數,再計算右邊的參數值。然后返回最右邊參數的值。
原書舉的例子不太好,無法解釋上面那句話,這里另外提供一個:
var a = 10, b = 20; function CommaTest(){ return a++, b++, 10; } var c = CommaTest(); alert(a); // 返回11 alert(b); // 返回21 alert(c); // 返回10
變量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])
知道了調用函數運算符后,我們舉個例子說明關於如何處理它們沖突的事。
alert(2*5, 2*4); // 輸出10
上面這段代碼輸出10,但是如果根據逗號運算符的原理來解釋的話,那應該是輸出8才對。為什么呢?
因為逗號運算符在JavaScript在的優先級是最底的,記住這一點非常有用。所以函數調用運算符將先於逗號運算符運行。結果alert函數輸出第一個參數的值。將上面的代碼修改成如下所示即可。
alert((2*5, 2*4)); // 返回8
逗號運算符和賦值運算賦的沖突
在JavaScript中,逗號運算符的優先級比賦值運算符還要底。請看下面的代碼
var a = 20; var b = ++a,10; alert(b);
這段代碼似乎不能運行,可能是由於賦值運算符優先於逗號表達式運行,如果將代碼改成
var a = 20; var b = (++a,10); alert(b);
即可了。
上面說到的“可能”我們這里做一下解釋,這是本人的一些看法,不一定權威。
逗號運算符要求它的運算數是一個復雜的表達式或簡單的表達式(如變量或直接量),但由於賦值運算符優先於逗號運算符執行,因此變成左邊不是一個運算數或一個表達式,而是一個含有var關鍵字的語句
之前不能執行的代碼可以看成如下代碼:
var a = 20; (var b = ++a),10; alert(b);
語句中有表達式語句,但不是所有的語句都是表達式。
#################################################
一、逗號運算符的特性及作用
逗號運算符的作用是將若干表達式連接起來。它的優先級別在所有運算符中是最低的,結合方向是"自左至右"的。
如:3*3,4*4
二、逗號表達式
逗號表達式的一般形式是:表達式1,表達式2,表達式3……表達式n
逗號表達式的求解過程是:先計算表達式1的值,再計算表達式2的值,……一直計算到表達式n的值。最后整個逗號表達式的值是表達式n的值。
看下面幾個例子:
//示例1 x1=8*2,x1*4 //x1的值為16, 整個逗號表達式的值為 64 console.log(x1); //16 // x1=16 64 console.log( (x1=8*2,x1*4) ); //64 //示例2 (x2=8*2,x2*4),x2*2 //x2的值為 16, 整個逗號表達式的值為 32 console.log(x2) //16 // x2=16 64 32 console.log( ( (x2=8*2,x2*4),x2*2 ) ) //32 //示例3 x3=(z3=5,5*2) //x3的值為整個逗號表達式的值, z3的值為5 console.log(x3); //10 console.log(z3); //5 //示例4 x4=z4=5,5*2 //整個表達式為逗號表達式,它的值為10,x4和z4的值都為5 console.log(x4, z4); //5 5 console.log( (x4=z4=5,5*2) ) // 10
逗號表達式用的地方不太多,一般情況是在給循環變量賦初值時才用得到。所以程序中並不是所有的逗號都要看成逗號運算符,尤其是在函數調用時,各個參數是用逗號隔開的,這時逗號就不是逗號運算符。
運算符使它兩邊的表達式以從左到右的順序被執行,並獲得右邊表達式的值。, 運算符最普通的用途是在 for 循環的遞增表達式中使用。例如:
var i, k; //同時聲明多個變量的方式(不看成逗號運算符) var j =0; for( i=0; i<10; i++, j++){ //每次循環結束時都執行 i++和j++ (逗號運算符) k = i + j; console.log(k); //總共輸出 0,2,4,......16, 18 }
每次通過循環的末端時, for 語句只允許單個表達式被執行。, 運算符被用來允許多個表達式被當作單個表達式,從而規避該限制。