JavaScript运算符优先级引起的bug

[下面是昨天发给同事的邮件,为防止泄露商业机密,隐去了项目名和变量名]

====================================================

昨天发现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

posted @ 2014-01-08 18:39  BruceJia  阅读(488)  评论(0编辑  收藏  举报