[下面是昨天發給同事的郵件,爲防止泄露商業機密,隱去了項目名和變量名]數組
====================================================函數
昨天發現Nx代碼中的一個bug,是因爲JavaScript運算符優先級問題引發的。spa
例子:對象
if (!a instanceof Array)索引
throw new Error("a should be an array");ip
......ci
if (!b instanceof Object)字符串
throw new Error("b should be an object");get
緣由:! Operator的優先級比instanceof的優先級要高,因此先計算!a, 結果爲boolean類型。it
而
true instanceof Array;
false instanceof Array;
true instanceof Object;
false instanceof Object;
都會返回false, 這致使全部的檢查都不起做用,J
下面摘錄的是JavaScript中運算符優先級, 以供參考。
4(共 5)對本文的評價是有幫助 - 評價此主題
運算符優先級描述了在計算表達式時執行運算的順序。 先執行具備較高優先級的運算,而後執行較低優先級的運算。 例如,先執行相乘,再執行相加。
JavaScript 運算符
下表列出了 JavaScript 運算符,並按優先級順序從高到低排列。 具備相同優先級的運算符按從左至右的順序計算。
運算符 |
說明 |
. [] () |
字段訪問、數組索引、函數調用和表達式分組 |
++ -- - ~ ! delete new typeof void |
一元運算符、返回數據類型、對象建立、未定義的值 |
* / % |
相乘、相除、求餘數 |
+ - + |
相加、相減、字符串串聯 |
<< >> >>> |
移位 |
< <= > >= instanceof |
小於、小於或等於、大於、大於或等於、是否爲特定類的實例 |
== != === !== |
相等、不相等、全等、不全等 |
& |
按位「與」 |
^ |
按位「異或」 |
| |
按位「或」 |
&& |
邏輯與 |
|| |
邏輯「或」 |
?: |
條件運算 |
= OP= |
賦值、賦值運算(如 += 和 &=) |
, |
多個計算 |
圓括號用於改變由運算符優先級肯定的計算順序。 這就是說,先計算完圓括號內的表達式,而後再將它的值用於表達式的其他部分。