JS中“==”和“===”的原理和区别
1、为什么讨论这个问题?
- 有个说法,尽量不用==,而使用===,是这样吗?
2、分析问题,原理是什么?
下面说说ECMAScript 5 language specification里的说明:
1)两种比较方法
全等号===只考虑类型相同的值的比较,不同类型使用===进行比较,返回false
双等号==会先将不同类型的值转为相同类型,然后使用全等号进行比较。
使用双等号会有两个问题:
● 转换规则可能不是你期望的那样
● 由于双等号是宽容的,类型错误可能会被忽略掉。
2)全等号===(严格等号)
比较两个值,
如果类型不同,一定返回false;
如果类型相同,则按照如下的规则进行比较:
① 两个都是undefined类型,返回true;(undefined === undefined)
② 两个都是null类型,返回true;(null === null)
③ 两个都是number类型
如果有一个是NaN,则为false;(Nan !== *//any value including NaN)
如果两个值相同,返回true;(x==x)
一个是+0,一个是-0(+0===-0)
④ 两个都是boolean类型或者两个都是string类型(基础数据类型,不是String对象),答案很明显。
"111" === "111"//true
true === true//true
⑤ 两个对象(包括array和function),除非是同一个对象(即同一个引用),否则都是false
var a = NaN;
a === a;//false(NaN无法用来比较)
var b = {}, c = {};
b === c;//false
b === b;//true
"abc" = new String("abc");//false(左边是基本数据类型string,后边是object类型)
注:ECMAScript中有5种基本数据类型(Undefined、Null、Boolean、Number、String)
还有1种复杂数据类型Object。
3)双等号==
比较两个值,如果两个值类型相同,则使用===进行对比;
如果两个值类型不同,则按照一下规则进行比较:
① undefined == null
② 一个number,一个string,将string转换成number类型再做比较;
③ 一个boolean,一个非boolean,将boolean转换成number类型再做比较;
④ 一个string或者number,跟一个object,将object转换成基本数据类型再做比较;
第三条规则会导致大于1的number值不等于true,比如:
0 == false//true
1 == true//true
2 == true//false(true -- > 1 ; 2 != 1)
2 ? true : false//true
"" == 0;//true
"123" == 123;//true
"" == false//true(false-->0;""-->0;0==0)
"1" == true//true
"2" == true//false(true-->1;"2"-->2;2!=1)
"true" == true//false(true-->1;"true"-->NaN;1!=NaN)
"2" ? true : false//true(because string is non-empty)
"abc" == new String("abc")//true(object->string)
3、得出结论和建议?
鉴于==的对比规则会出现一些意想不到的结果,建议尽量多使用===,而非==。
参考文章:
http://www.2ality.com/2011/06/javascript-equality.html
https://www.zhihu.com/question/31442029
JS中“==”和“===”的原理和区别的更多相关文章
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...
- (网页)Angular.js 中 copy 赋值与 = 赋值 区别
转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...
- js中的substr和substring区别
js中的substr和substring区别 Substring: 该方法可以有一个参数也可以有两个参数. (1) 一个参数: 示例: var str=“Olive”: str.substring( ...
- JS 中的require 和 import 区别整理
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- js中JSON和JSONP的区别,让你从懵逼到恍然大悟
说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服 ...
- [转]html js中name和id的区别和使用分析
js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, ST ...
- js中__proto__和prototype的区别和关系?
_proto__(隐式原型)与prototype(显式原型)1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性 ...
- 浅谈js中null和undefined的区别
在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...
随机推荐
- [原]F5负载均衡激活license
一.pc用网线连接上f5的管理口,开机,ping 192.168.1.245 二.用浏览器登录:https://192.168.1.245 用户名 admin 密码 admin
- Android数据库开发——SQLite
上篇博客提到过SQLite,它是嵌入式数据库,由于其轻巧但功能强大,被广泛的用于嵌入式设备当中.后来在智能手机.平板流行之后,它作为文件型数据库,几乎成为了智能设备单机数据库的必选,可以随着安卓app ...
- locate命令的使用
使用locate命令,遇到了这样的情况:当前目录下有一个文件,而使用这个命令时却查找不到这个文件,上网查了一下,找到了原因,就在下面. 1. find find是最常见和最强大的查找命令,你可以用它找 ...
- 判断String 中文混输 长度
extends:http://www.tuicool.com/articles/EB36Jv public static int calculateLength(String etString) { ...
- [LintCode] Find the Missing Number 寻找丢失的数字
Given an array contains N numbers of 0 .. N, find which number doesn't exist in the array. Example G ...
- zTree实现节点修改的实时刷新
一.应用场景 在实际应用中会遇到动态操作树各节点的需求,在增加树节点后如何实时动态刷新树就十分有必要了. 二.项目实践 比如要在test1234节点下新建子节点,首先要选中test1234节点,添 ...
- Nginx配置认证登录
本配置实现Nginx认证登录以免重要信息暴露在公网 日志收集ELK展示工具kibana免费版不支持密码验证,需要设置Nginx反向代理然后关闭kibana默认端口5601使用Nginx端口登录进行用户 ...
- HDFS文件系统的JAVA-API操作(一)
使用java.net.URL访问HDFS文件系统 HDFS的API使用说明: 1.如果要访问HDFS,HDFS客户端必须有一份HDFS的配置文件 也就是hdfs-site.xml,从而读取Nameno ...
- SHU 413 - 添加好友
题目链接:http://acmoj.shu.edu.cn/problem/413/ 不难发现,这题是求C(n,1)+C(n,2)+C(n,3)+……+C(n,n-1)+C(n,n) 根据二项展开式有( ...
- 删除RAC集群节点
删除GRID集群节点:参考oracle database 11g RAC手册(第二版) 目前GRID集群中节点信息:[grid@node1 ~]$ olsnodesnode1node2node3nod ...