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

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

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

JavaScript运算符优先级引起的bug的更多相关文章

  1. javascript 运算符优先级

    JavaScript 运算符优先级(从高到低) https://github.com/xhlwill/blog/issues/16 今天把js函数转换为python 函数时,发现在js运算符优先级这边 ...

  2. JavaScript运算符优先级——"++,--,&&,||“

    上篇文章比较了"?,="三者的优先级:"?">"=">"," 今天继续学习"++,--,& ...

  3. JavaScript运算符优先级

    图片引用自:http://www.cnblogs.com/xxcanghai/p/5189353.html

  4. javascript运算符优先级顺序

    1 ()2 !.-(负号).++.-- 3 *./.%4 +.- 10-55 <.<=.<.>=6 ==.!=.===.!==.7 &&8 ||9 ?:10 = ...

  5. (转)JavaScript中的运算符优先级

    JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低的优先级列出J ...

  6. JavaScript基础之运算符及全面的运算符优先级总结

    算数运算符: 加+,减—,乘*,除/,求余%,加加++,减减——, 加减乘除求余运算与数学上的用法完全一样. 不过,加号+还有连接字符串的作用,其他运算符还可以将字符串数字转换成数值型,参见JavaS ...

  7. 运算符优先级 (JavaScript)

    运算符优先级描述了在计算表达式时执行运算的顺序.先执行具有较高优先级的运算,然后执行较低优先级的运算.例如,先执行相乘,再执行相加. JavaScript 运算符     下表列出了 JavaScri ...

  8. JavaScript 运算符的优先级

    ㈠逗号(,)运算符 ⑴使用 , 可以分割多个语句,一般可以在声明多个变量时使用 , : ⑵使用 , 运算符同时声明多个变量    // var a , b , c ; ⑶可以同时声明多个变量并赋值   ...

  9. javascript运算符语法概述

    × 目录 [1]个数 [2]优先级 [3]结合性[4]类型[5]规则表 前面的话 javascript中的运算符大多由标点符号表示,少数由关键字表示,它们的语法言简意赅,它们的数量却着实不少.运算符始 ...

随机推荐

  1. P3440 [POI2006]SZK-Schools

    传送门 应该是很显然的费用流模型吧... $S$ 向所有学校连边,流量为 $1$,费用为 $0$(表示每个学校要选一个编号) 学校向范围内的数字连边,流量为 $1$,费用为 $c|m-m'|$(表示学 ...

  2. WindowsServer2008安装IIS相关服务

    控制面板->程序->打开或关闭Windows功能 添加角色,选择IIS服务器,选择以下角色服务,如果添加过就选择添加角色服务 如果出现500错误,这个跟程序没有多大关系,可以试一下以下操作 ...

  3. java 位运算符,逻辑运算符

    逻辑运算符;布尔值时使用 a=true;b=false &: 逻辑或   例:a & b=false; |: 逻辑与   例:a | b=true; !:逻辑非    例:!a=fal ...

  4. git删除远程主机没有的tag

    可以先删除所有本地tag,然后再拉取远程上的tag git tag -l | xargs git tag -d git fetch --tags 其他方法以及查询tag的命令请见:Remove loc ...

  5. "Calendars" and "DateFormats" should not be static

    参见:Call to method of static java.text.DateFormat not advisable?   级别:bug, multi-threading Not all cl ...

  6. [PY3]——合并多个字典或映射(collections模块中的ChainMap 类)

    问题 现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作, 比如查找值或者检查某些键是否存在. 解决方案 使用 collections 模块中的 ChainMap 类 Cha ...

  7. [转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务

    本文转自:http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然 ...

  8. e.pageX、e.clientX、e.screenX、e.offsetX的区别以及元素的一些CSS属性

    e.pageX,e.pageY:返回的值是相对于文档的定位,文档的左上角为(0,0),向右为正,向下为正,IE不支持: e.clientX,e.clientY:返回的值是相对于屏幕可见区域的坐标,如果 ...

  9. 怎样在 Azure 应用服务中生成和部署 Java API 应用

    先决条件 Java 开发人员工具包 8(或更高版本) 已在开发计算机上安装 Maven 已在开发计算机上安装 Git Azure 订阅付费版或试用版 HTTP 测试应用程序,如 Postman 使用 ...

  10. 第7天:javascript-DOM 获取标签、注册事件改变属性的值、innerText、改变属性的值等

    javascript WEB api------DOM document object model 案例 为元素注册点击事件,弹出对话框 <input type="button&quo ...