運算符優先級
本文不會具體到每個運算符的優先級比較,而是側重於介紹運算符優先級在代碼中的相關規則
var a = "a",
b = "b",
c = "c";
a && b || c; //"b"
a || b && c; //"a"
先來看上面的例子
首先JavaScript的默認執行順序是從左到右的
那麼按照順序運行的話
運行的應該是(a&&b)||c和(a||b)&&c
返回的應該是"b"(a爲true , a&&b返回"b" , "b"爲true , "b"||c返回"b" )
和"c"(a爲true , a||b返回"b" , "b"爲true , "b"&&c返回"c")纔對
(關於&&和||的規則不懂的可以看這JavaScript 學習筆記 之 強制類型轉換 (二) 中 ||和&& 一節)
於是在這裏就引入了一個運算符優先級的概念(本例中的&&優先級大於||,&&和||的優先級又大於?:(三元運算符)大於=運算符)
再來看看之前的例子(JavaScript 學習筆記 之 語句和表達式中 表達式行爲 一節)
var a = 42;
var b = (a++, a);
b; //43
var a = 42;
var b = a++, a;
b; //42
這個例子中出現差異的原因在於","運算符在連接一系列語句的時候,優先級最低
短路
之前提到過的&&和||存在一個叫做"短路"的特性
對&&和||來說,如果從左邊的操作數能得出結果,那麼就可以忽略右邊的操作數,這種執行最短路徑的現象就是短路
比如 a&&b 如果a爲false則返回a而忽略b
a||b 中如果a爲true也會只返回a而忽略b
關聯
如果多個相同優先級的運算符同時出現,該如何處理呢?
一般來說,運算符的關聯不上從左到右就是從右到左,這取決於組合是從左開始還是從右開始
如果&&是左關聯的話,a&&b&&c會被處理成(a&&b)&&c
如果&&是右關聯的話,a&&b&&c會被處理成a&&(b&&c)
這裏有個誤解,不管是右關聯還是左關聯,a&&b&&c的嚴格執行順序都是從左到右,先運行a,b然後是c
執行順序和關聯並不是一回事
關聯只是決定組合的方向(也就是能用()括起來的方向)
var a={
name:"初始a"
}
var b=a;
a.son=a={name:"新的a"};
a;//{name: "新的a"}
b;//{name: "初始a", son: {…}}
來看看這個例子,首先=運算符是右關聯性的運算符
因此a.son=a={..}實際上等同於 a.son =( a= {..} )
但是執行順序依舊是 a.son , a 然後是{..}
因此執行a.son的時候a指向的是name值爲初始a的那個對象
另一個右關聯(組合)的運算符的例子是?:(三元運算符)
true ? false : true ? true : true; //false
//當?:爲右結合運算符的時候
true ? false : (true ? true : true); //false
//當?:爲左結合運算符的時候
(true ? false : true) ? true: true; //true