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")纔對

(關於&&和||的規則不懂的可以看這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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章