1. 程式人生 > >JavaScript 學習筆記 之 運算子優先順序

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