官术网_书友最值得收藏!

1.4.4 運算符優先級

在JavaScript中存在一系列的運算符,每個運算符都有各自的優先級,優先級決定了表達式在執行時的先后順序,其中優先級最高的最先執行,優先級最低的最后執行。

我們以下面一個表達式為例。


a OP1 b OP2 c

當我們使用不同的OP運算符時,語句的執行順序是不一樣,以下面兩個語句為例。


// 語句1
a = b = c;  // a = b = 10;
// 語句2
a > b > c; // 6 > 4 > 3

在語句1中,將運算符OP1與OP2同時設置為賦值運算符,因為優先級相同,所以會從右到左依次運行,結果等同于下面的情況。


b = 10;
a = 10;

在語句2中,將運算符OP1與OP2同時設置為比較運算符,因為優先級相同,所以從左至右依次執行,結果等同于下面的情況。


6 > 4; // true
true > 3 // false

最終會返回“false”。

下面總結了在JavaScript中存在的運算符,并將它們的優先級從高至低排列,如表1-1所示,方便大家查詢。

表1-1

續表

續表

通過表1-1我們可以發現,在JavaScript中一共存在20種優先級的運算符,其中包含一些符號相同但是優先級不同的運算符,例如前置遞增運算符和后置遞增運算符。

另外,在一個語句中如果存在多個運算符時,需要我們熟練掌握各個運算符的優先級,才能得到正確的運算結果。


var arr = [];
var y = arr.length <= 0 || arr[0] === unde?ned ? x : arr[0];

上面的語句中存在小于等于(<=),邏輯或(||),全等號(===),條件運算符(? :)這4種運算符。

根據運算符優先級表格,我們知道運算符執行順序為:小于等于(<=)、全等號(===)、邏輯或(||)、條件運算符(? :)。

因此實際執行的順序如下。


var y = ((arr.length <= 0) || (arr[0] === unde?ned)) ? x : arr[0];

需要特別關注的是,小括號可以用來提高優先級,因為小括號在所有運算符的優先級中是最高的,所以在小括號中的表達式是最先執行的。


(3 + 4) * 5;

上面的語句因為小括號的存在,會優先執行3 + 4 = 7,然后執行乘法7 × 5 = 35。

運算符因為多樣性的存在而導致優先級判斷很復雜,因此建議使用小括號,以保證運算順序清晰可讀,這對代碼的維護和除錯至關重要。

但是,小括號并不是運算符,所以不具有求值作用,它只改變運算的優先級。

下面代碼的第二行,如果小括號具有求值作用,那么就會變成1 = 2,是會拋出異常的。但是,下面的代碼可以運行,這驗證了小括號只會改變優先級,不會求值。


var x = 1;
(x) = 2;

這也意味著,如果整個表達式都放在小括號之中,那么不會有任何效果。


(exprssion)
// 等同于
expression

函數放在小括號中,會返回函數本身。如果小括號緊跟在函數的后面,就表示調用函數。


function f() {
 return 1;
}

(f); // function f(){return 1;}
f(); // 1

小括號之中只能放置表達式,如果將語句放在小括號之中,就會報錯。


(var a = 1); // SyntaxError: Unexpected token var

主站蜘蛛池模板: 家居| 临海市| 天津市| 洪江市| 全南县| 池州市| 海门市| 黑龙江省| 建瓯市| 平阳县| 满城县| 中卫市| 常州市| 乐安县| 长子县| 温宿县| 廉江市| 囊谦县| 敦化市| 瓮安县| 垦利县| 广宗县| 丰顺县| 巴林左旗| 海丰县| 云南省| 灌南县| 玛多县| 招远市| 峨眉山市| 河源市| 南华县| 久治县| 凭祥市| 兴海县| 凤冈县| 临夏市| 台湾省| 长泰县| 安阳市| 乐至县|