JS中、=和Object.is()的区别

首先,先粗略了解一下这三个玩意儿:

  • ==:等同,比较运算符,两边值类型不同的时候,先进行类型转换,再比较;
  • ===:恒等,严格比较运算符,不做类型转换,类型不同就是不等;
  • Object.is()是ES6新增的用来比较两个值是否严格相等的方法,与===的行为基本一致。

下面分别详细说明一下这三个玩意儿:

1.先说===,这个比较简单,只需要利用下面的规则来判断两个值是否恒等就行了:

如果类型不同,就不相等

如果两个都是数值,并且是同一个值,那么相等; 

值得注意的是,如果两个值中至少一个是NaN,那么不相等(判断一个值是否是NaN,可以用isNaN()或Object.is()来判断)。

如果两个都是字符串,每个位置的字符都一样,那么相等;否则不相等。

如果两个值都是同样的Boolean值,那么相等。

如果两个值都引用同一个对象或函数,那么相等,即两个对象的物理地址也必须保持一致;否则不相等。

如果两个值都是null,或者都是undefined,那么相等。

2. 再说Object.is(),其行为与===基本一致,不过有两处不同:

  • +0不等于-0。
  • NaN等于自身。

举个栗子☺:

+0 === -0 //true

NaN === NaN // false

Object.is(+0, -0) // false

Object.is(NaN, NaN) // true

3. 最后说==,根据以下规则来进行判断:

  • 如果两个值类型相同,进行===比较。
  • 如果两个值类型不同,那么他们可能相等。根据下面规则进行类型转换,然后再比较:
  • 如果一个是null、一个是undefined,那么相等。
  • 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
  • 如果任一值是true,把它转换成 1 再比较;如果任一值是false,把它转换成 0 再比较。
  • 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。
  • JS的核心内置类,会尝试valueOf先于toString;但有一个是例外——Date,Date利用的是toString转换。
  • 非JS核心的对象,令说(比较麻烦,我也不大懂)。
  • 任何其他组合,都不相等。

举个栗子☺:

"1" == true:类型不等,true 会先转换成数值 1 ,现在变成 “1” == 1 ,再把 “1” 转换成 1 ,比较 1 == 1 , 相等。

总结

=:赋值运算符。

==:等于。

===:严格等于。

Object.is():加强版严格等于。

例:

var a = 3;
var b = "3";
a==b; // true
a===b; // false,因为a,b的类型不一样
Object.is( a, b ); //false,因为a,b的类型不一样

最后来个实战例子吧

体会一下ES6中的这个新特性是不是爽歪歪~~

// 2. 找出数组中的所有数字,并把结果进行累加,请写出对应的程序
let arr = ['m', '', 1, NaN, 20, 3, '20px', 56, 18, Infinity];
let r4 = arr.reduce((result,item,index,self)=>{
if (!Object.is(item,'') && !Object.is(item,NaN) && !Object.is(item,Infinity) && typeof item === 'number'){
return result + item
}else{
return result
}
},0) console.log(r4);

JS中==、===和Object.is()的区别的更多相关文章

  1. JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

    JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...

  2. 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂

    浅谈JS中的!=.== .!==.===的用法和区别   var num = 1;     var str = '1';     var test = 1;     test == num  //tr ...

  3. (网页)Angular.js 中 copy 赋值与 = 赋值 区别

    转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...

  4. js中的substr和substring区别

    js中的substr和substring区别 Substring: 该方法可以有一个参数也可以有两个参数. (1)  一个参数: 示例: var str=“Olive”: str.substring( ...

  5. JS 中的require 和 import 区别整理

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  6. JS中typeof与instanceof的区别

    JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: Typeof typeof 是一个一元运算,放在一个运算数之前 ...

  7. [转]html js中name和id的区别和使用分析

    js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, ST ...

  8. JS中typeof与instanceof的区别 (2010-05-26 10:47:40

    JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: typeof typeof 是一个一元运算,放在一个运算数之前 ...

  9. 浅谈js中null和undefined的区别

    在JS中,null和undefined是经常让人摸不着头脑的东西,尤其是在数据初始化以及处理的过程中,经常稍微不注意,就会让页面在渲染时出现报错,下面来细说下,这两者之间的区别: null 表示一个对 ...

  10. js中的call,apply,bind区别

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

随机推荐

  1. Bulma 源码解析之 .columns 类

    {说明} 这一部分的源码内容被我简化了,另外我还额外添加了一个辅助类 is-grow. .columns // 修饰类 &.is-centered justify-content: cente ...

  2. 数据结构--树--AVL树

    详情查看:http://www.cnblogs.com/skywang12345/p/3577360.html

  3. break跳出多重循环

    大家都知道break只能跳出当前的一个循环语句,如果碰到要跳出多个循环体,那么我们就该在循环体开头设置一个标志位,然后使用带此标志位的break语句跳出多重循环 jump: ;i<;i++){ ...

  4. linux没有wifi

    linux的wifi出现问题的介绍 几次重装linux系统,经常出现没有wifi的状况 错误详情 之前安装过CentOS,Kylin,OpenSU,等等经常出现没有wifi的状况,虽说猜测是遇到驱动问 ...

  5. 2014年第五届蓝桥杯省赛试题(JavaA组)

    1.结果填空 (满分2分)2.结果填空 (满分6分)3.结果填空 (满分7分)4.代码填空 (满分4分)5.代码填空 (满分12分)6.结果填空 (满分12分)7.结果填空 (满分9分)8.程序设计( ...

  6. github分支管理

    一. 需要创建的分支 1.master 主分支 2.dev 开发分支 3.bug 修改bug分支 4.release 预发布分支 二.分支使用 1.在master上创建dev,bug,release分 ...

  7. 根据GridView模板里的列名获取列索引

    以前Insus.NET在写过一篇<在Gridview控件中根据Field Name来取得对应列索引> http://www.cnblogs.com/insus/archive/2010/0 ...

  8. javascript 获取标签内的内容

    js 获取标签内的内容 参考:这篇博客给了我很大的启发. http://www.cnblogs.com/breakdown/archive/2012/10/09/2716221.html 我遇到的问题 ...

  9. Git master branch has no upstream branch的解决

    Git master branch has no upstream branch的解决 在push代码时,出现“git master branch has no upstream branch”问题的 ...

  10. 启动HBase脚本start-hbase.sh时报Class path contains multiple SLF4J bindings.解决方法

    1. 使用start-hbase.sh启动HBase时报Class path contains multiple SLF4J bindings.错误,原因是jar包冲突导致的.所以,对于和Hadoop ...