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
JavaScript运算符优先级引起的bug的更多相关文章
- javascript 运算符优先级
JavaScript 运算符优先级(从高到低) https://github.com/xhlwill/blog/issues/16 今天把js函数转换为python 函数时,发现在js运算符优先级这边 ...
- JavaScript运算符优先级——"++,--,&&,||“
上篇文章比较了"?,="三者的优先级:"?">"=">"," 今天继续学习"++,--,& ...
- JavaScript运算符优先级
图片引用自:http://www.cnblogs.com/xxcanghai/p/5189353.html
- javascript运算符优先级顺序
1 ()2 !.-(负号).++.-- 3 *./.%4 +.- 10-55 <.<=.<.>=6 ==.!=.===.!==.7 &&8 ||9 ?:10 = ...
- (转)JavaScript中的运算符优先级
JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低的优先级列出J ...
- JavaScript基础之运算符及全面的运算符优先级总结
算数运算符: 加+,减—,乘*,除/,求余%,加加++,减减——, 加减乘除求余运算与数学上的用法完全一样. 不过,加号+还有连接字符串的作用,其他运算符还可以将字符串数字转换成数值型,参见JavaS ...
- 运算符优先级 (JavaScript)
运算符优先级描述了在计算表达式时执行运算的顺序.先执行具有较高优先级的运算,然后执行较低优先级的运算.例如,先执行相乘,再执行相加. JavaScript 运算符 下表列出了 JavaScri ...
- JavaScript 运算符的优先级
㈠逗号(,)运算符 ⑴使用 , 可以分割多个语句,一般可以在声明多个变量时使用 , : ⑵使用 , 运算符同时声明多个变量 // var a , b , c ; ⑶可以同时声明多个变量并赋值 ...
- javascript运算符语法概述
× 目录 [1]个数 [2]优先级 [3]结合性[4]类型[5]规则表 前面的话 javascript中的运算符大多由标点符号表示,少数由关键字表示,它们的语法言简意赅,它们的数量却着实不少.运算符始 ...
随机推荐
- 华南理工大学“三七互娱杯”程序设计竞赛 HRY and codefire(概率期望DP)
https://ac.nowcoder.com/acm/contest/874/A 题目:有两个账号 , 一开始都为0级 , 求任意一个账号升级到N的期望 要求:如果当前账号嬴了 , 就继续沿用当前的 ...
- GeneXus学习笔记——创建一个知识库 哈哈哈哈!
终于想到写什么东西了(绝对不是因为懒 好吧 信我) 那么进入正题 我们写项目的时候 遇到一些问题啥的 总会听到大佬说:“这有什么难的 说到底不就是简单的增删改查么" 然后我们就会露出 Σ ...
- 利用flask-sqlacodegen快速导入ORM表结构
利用flask-sqlacodegen快速导入ORM表结构 友情提示:如果是使用pymysql请预先pip install 哦~ 这是window下使用virtualenv环境下执行的 Linux用户 ...
- mvvm小论(暂记)
广州-PC26(34627) 2:09:44 在android 线程最后用 handler = new Handler(); updateThread = new Runnabl ...
- python-poll实现异步IO
#!usr/bin/python from socket import * from select import * from time import ctime s=socket() s.bind( ...
- webpack使用 babili-webpack-plugin 报错 "original.line and original.column are not numbers"
按照这个解决 https://github.com/chentsulin/electron-react-boilerplate/issues/1300 changing "babili-we ...
- Asp.Net的Forms验证,解决Cookie和Seesion失效时间
网站开发中用户验证一般采用Asp.Net的Forms验证,验证票据存储到Cookie的方式. Session方式是将验证信息存储在内存中,如果你使用的虚拟主机给你分配很小的内存,实际上都是如此,那么s ...
- 用Ajax爬取今日头条图片集
Ajax原理 在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有.这是因为requests获取的都是原始 ...
- Tomcat源码分析——请求原理分析(下)
前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...
- CodeIgniter 目录结构详解
1. myshop 2. |-----system 框架程序目录 3. |-----core 框架的核心程序 4. |-----CodeIgniter.php 引导性文件 5. |-----Commo ...