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