JavaScript 學習筆記 之 運算子優先順序
運算子優先順序
本文不會具體到每個運算子的優先順序比較,而是側重於介紹運算子優先順序在程式碼中的相關規則
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")才對
於是在這裡就引入了一個運算子優先順序的概念(本例中的&&優先順序大於||,&&和||的優先順序又大於?:(三元運算子)大於=運算子)
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