不同的運算子一起出現時,會根據其優先性(Precedence)來決定誰先誰後。MDN也很貼心的整理成表格了。
雖然有表格可以供我們查找,但是總不可能每一次用到運算子的時候,我們都去查找吧?我們最好對這張表有直觀上的理解與記憶。
那麼就讓我來分享我如何理解與記憶這張表吧!
根據記憶法,要記憶一大堆資訊時。第一步就是將用我們可以理解的方式分成幾個大類(根據頭腦記憶的極限,最好限縮在 7+-2個大類)。第二步就是用我們已經熟悉的知識架構來切入分類。
那我們就從熟悉的四則運算開始吧,大家應該都記得其原則是
1.先乘除,後加減
2.()裡面的優先計算
所以得出,運算會有三種: 加減、乘除、括號()
接著,我們已寫code的經驗去想運算子還會做什麼事?
到目前為止,我們可以將運算子分成六大類
接著,讓我們來看看MDN整理的表,這張表的優先性是從19(最高)排到最低(1)。我們就用數字王室與平民的故事來記憶這張表吧。
1.()
讓我們想想四則運算中的(),用()就能決定那些運算先進行。所以()的優先性會是最高的,所以其對應到的優先性是19
2.加減乘除
再來,讓我們回到基礎的運算,加減。他們對應到的優先性是12。為了幫助記憶,我們可以想像是撲克牌中的Q,你可以想像皇后的職責是對事物進行加減。
比加減更高一層就是 乘除,。他們對應到的優先性是13。你可以把它記成K。國王的職等比皇后高,可以對事物進行乘除。
在運算中,除了基礎的加減乘除,還會有 累積、累減、指數運算等計算,他們的優先性都高於基本的運算。
3.指數運算 ...**…
先看指數運算,他的符號是...**…
這裡我跟各位坦承,這個除非要做演算法之類的運算,不然很少用。但是它對於我的這套記憶方法很有用處。
指數運算對應的優先性是14,延續剛剛13是k的聯想。我可以把**… ** …** 聯想成 法國國王路易14。它的下場是被斷頭台砍頭,而這個符號剛好蠻像被斷頭台斷頭的樣子(發揮你的想像力)。
4.累加累減
再來則是前後的累加累減 ++ … 與 … ++
前累加( ++ … )的優先性對應到15,後累加(… ++)對應的是16。
我們一樣從圖像來想像,++長得像皇冠,我們可以延續路易14的故事。在可憐的路易14被砍頭後,他們後代又戴上了皇冠(對應到 ++ … 15),但後來皇冠又掉落了(對應… ++ 16)
在記憶完數字王室後,我們來看看屬於平民階層的比較與邏輯。
為了分成勝負,比誰的拳頭大往往比邏輯有用。所以比較的優先性會高於邏輯。
1.比較
而比較,就是想分出高低,所以最高的比較會是 > 或 < ,他們對應的優先性是10。對應撲克牌剛好就只是數字,不再是穿西裝的牌了。
在無法分出高下時,我們才會求和,來看我們相不相等。所以接著是 === ! ==,他們對應的是9
2.邏輯
在比較之後,我們才要講邏輯。邏輯中有 AND 與 OR。
AND必須兩者都相等,比較嚴格,所以優先性較高,是 5。
OR 只要有一者正確,沒那嚴格。優先性是4。
等等,我們遺忘了NOT這個邏輯。
NOT的優先性超高,是15。
這裡我們一樣用上面的數字王室的故事來講,當15號王重拾皇冠後,人民對國王說,我們有否定你的權利,所以人民的 NOT 與15號王的優先性一樣高。
在我們為了運算子安排好優先位置後,我們還剩下賦值這一類。而他們優先性真的相較之下真的是最低的。他們優先性是2。
這已寫程式的經驗也好理解,通常都要先等運算完再賦值。
最後現在我們的表會長這樣