JavaScript運算符優先級引發的bug

[下面是昨天發給同事的郵件,爲防止泄露商業機密,隱去了項目名和變量名]數組

====================================================函數

昨天發現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中運算符優先級, 以供參考。

 

運算符優先級 (JavaScript)

4(共 5)對本文的評價是有幫助 - 評價此主題

運算符優先級描述了在計算表達式時執行運算的順序。 先執行具備較高優先級的運算,而後執行較低優先級的運算。 例如,先執行相乘,再執行相加。

JavaScript 運算符


下表列出了 JavaScript 運算符,並按優先級順序從高到低排列。 具備相同優先級的運算符按從左至右的順序計算。

運算符

說明

. [] ()

字段訪問、數組索引、函數調用和表達式分組

++ -- - ~ ! delete new typeof void

一元運算符、返回數據類型、對象建立、未定義的值

* / %

相乘、相除、求餘數

+ - +

相加、相減、字符串串聯

<< >> >>>

移位

< <= > >= instanceof

小於、小於或等於、大於、大於或等於、是否爲特定類的實例

== != === !==

相等、不相等、全等、不全等

&

按位「與」

^

按位「異或」

|

按位「或」

&&

邏輯與

||

邏輯「或」

?:

條件運算

OP=

賦值、賦值運算(如 += 和 &=)

,

多個計算

圓括號用於改變由運算符優先級肯定的計算順序。 這就是說,先計算完圓括號內的表達式,而後再將它的值用於表達式的其他部分。

 

 

來源:http://technet.microsoft.com/zh-cn/library/z3ks45k7

相關文章
相關標籤/搜索