淺談JS中逗號運算子的用法_javascript技巧

來源:互聯網
上載者:User

注意:

一、由於目前正在功讀JavaScript技術,所以這裡拿JavaScript為例。你可以自己在PHP中試試。

二、JavaScript文法比較複雜,因此拿JavaScript做舉例。

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

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

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

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

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

謂的運算式就是—— 一個JavaScript的“短語“,JavaScript的解譯器可以計算它,從而產生一個值。運算式可

以分為以下三種:

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

2) 變數

直接量運算式的值就是這個直接量本身,Variant 運算式的值則是該變數所存放或引用的值。

3) 可以“合并”上面提到的“簡單”運算式來建立為比較複雜的運算式。例如1.7是運算式,i也是運算式,下面的代碼所示的同樣也是(也可以叫)運算式:

i + 1.7

上面這個運算式的值是兩個簡單運算式(一個Variant 運算式和一個簡單運算式)的和。在此例中,“+”是一個運算子,用於將兩個簡單運算式合并起來以組成一個複雜的運算式。

運算數的個數

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

JavaScript還支援三元操作符“?:”,它可以將三個運算式合并為一個複雜的運算式。

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

逗號運算子,它將先計算左邊的參數,再計算右邊的參數值。然後返回最右邊參數的值。

原書舉的例子不太好,無法解釋上面那句話,這裡另外提供一個:

<script>var a = 10, b = 20;function CommaTest(){return a++, b++, 10;}var c = CommaTest();alert(a); // 返回11alert(b); // 返回21alert(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 語句只允許單個運算式被執行。, 運算子被用來允許多個運算式被當作單個運算式,從而規避該限制。

以上這篇淺談JS中逗號運算子的用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.