六角學院 JS 核心筆記 (十五)【運算子、型別與文法】- 優先性和相依性
AdSense
前言
優先性 Operator precedence:決定運算子運算或是說被語法解析的優先順序。
相依性 Associativity:當優先序相同時,使用相依性決定運算方向。
小學一定都學過最簡單的優先性和相依性概念:先乘除後加減。
優先性和相依性
賦值運算符 (Assignment operator) 為右相依性,其餘就直接參考:MDN - 運算子優先序。
陷阱題一
在優先順序中,… ++
後置遞增運算子 (Postfix Increment) 優先於 ++ …
前置遞增運算子 (Prefix Increment)。並且相依性由左至右:
1 | ++a; // 先加 1,再回傳 |
因此下方第二行的 ++a
是先將 10 加 1 賦值到 a
,再回傳 a
(也就是回傳 11),變成 console.log(11 * a)
。第二個 a
也是 11,因此變成 console.log(11 * 11)
。
第四行依此類推,變成 console.log(9 * 9)
。
1 | let a = 10; |
陷阱題二
之前六角學院 JS 核心筆記 (十)【運算子、型別與文法】- 陳述式與表達式有傳遞過一個觀念,所有的表達式都會回傳結果。值得注意的是,如果沒有變數接收這個回傳的值時,它就會立即被釋放,不會被儲存。
因為 writable: false
的特性,第七行的 a.test
不能接收賦予的新值,不會被改變,因此 a.test
還是 2
。
第 11 行 a.test = 100
是表達式,回傳 =
右側的值,也就是回傳 100
。 a.test
還是不會被改變。而後 b = 100
,因此被賦值 100
。
1 | let a = {}; |
參考資料:
MDN - 運算子優先序
六角學院:JavaScript 核心篇 - 邁向達人之路