• 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

  • 相关阅读:
    Executors线程池
    解决HtmlAgilityPack无法获取form标签子节点的问题
    nohup不输出日志信息的方法,及linux重定向学习
    将博客从jekyll迁移到了hexo
    node-webkit中使用sqlite3(MAC平台)
    借助Nodejs在服务端使用jQuery采集17173游戏排行信息
    Shell脚本中的交互式命令处理
    通过桥接虚拟网卡使VMWare和宿主机实现双向通讯
    MySql使用show processlist查看正在执行的Sql语句
    Sql合并两个select查询
  • 原文地址:https://www.cnblogs.com/brucejia/p/3511174.html
Copyright © 2020-2023  润新知