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

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

昨天发现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. Flutter框架概览

    前言:进入新框架的开发前,有必要整体了解框架设计及特点,对该框架初步认识,此文对Flutter框架进行浅显梳理,以备查阅: Flutter框架   从该架构图可知,Flutter框架可分为Framew ...

  2. ADO.NET中DbConnection.GetSchema方法的使用总结

    此方法获取数据库的结构,所以可以用它获取数据库中所有的表 先上代码 string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;U ...

  3. MySQL3534

    1.mysqld install 2.mysqld --initialize-insecure自动生成无密码的root用户 3.mysql -uroot即可登录

  4. js判断数组中是否有重复值得三种方法

    方法一: var s = ary.join(",")+","; for(var i=0;i<ary.length;i++) { if(s.replace( ...

  5. Chapter 14. Blocks and Statements

    14.5. Statements There are many kinds of statements in the Java programming language. Most correspon ...

  6. JavaScript数据结构-2.排序算法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 解决: selenium webdriver unable to find Mozilla geckodriver

    1 安装 sudo apt-get install libqt4-dev libqtwebkit-dev 2 gem install capybara-webkit 3 在rails-helper.r ...

  8. 深度学习(二)BP求解过程和梯度下降

    一.原理 重点:明白偏导数含义,是该函数在该点的切线,就是变化率,一定要理解变化率. 1)什么是梯度 梯度本意是一个向量(矢量),当某一函数在某点处沿着该方向的方向导数取得该点处的最大值,即函数在该点 ...

  9. -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment avariable and mvn script match.

    eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  10. ASP.NET Core 的启动和运行机制

    目录 ASP .NET Core 的运行机制 ASP .NET Core 的启动 ASP .NET Core 的管道和中间件 参考 ASP .NET Core 的运行机制 Web Server: AS ...