ES6+ Object.is()
在 ES5 中判断两个值是否相等基本都是使用 ==
或 ===
来判断,ES6 提供了 Object.is()
来判断两个值是否相同,这个弥补了使用等号方式判断所存在的问题。
Object.is()
会接收两个需要判断的参数,最后返回布尔值,如果相同则返回 true
否则返回 false
。
语法使用:
Object.is(value1, value2);
参数解释:
下面通过一些案例来说明一下 Object.is()
的使用:
Object.is('imooc', 'imooc'); // true
Object.is('imooc', 'mooc'); // false
Object.is(window, window); // true
Object.is([], []); // false
var foo = { a: };
var bar = { a: };
var obj = foo;
Object.is(foo, foo); // true
Object.is(foo, bar); // false
Object.is(foo, obj); // true
Object.is(null, null); // true
// 特例
Object.is(, -); // false
Object.is(, +); // true
Object.is(-, -); // true
Object.is(, /); // true
上面的中,需要注意的是,在对象判断时,如果判断的数据是引用类型,即使两个对象值是一样的,但是它们也会返回 false
,这是由于对象的存储方式决定的。在判断 0 和 - 0 的时候,二者不是同值,所以返回 false
。
判断值相等,一般有两种 ==
(双等) 和 ===
(三等),他们之间有所不同。在值对比的过程中,类型转换在中间起到重要的作用,在对比过程中必须考虑到,值是否被类型转换了。
==
是非严格相等的对比运算符,它只会对比两边的操作数是否相等,相等则会返回 true
。如果对比的操作数类型不同,则会将值进行隐式转换为一种常见的类型,然后才进行比较。我们来看如下的实例:
== - // true
== '0' // true
== false // true
== '' // true
"" == false // true
null == undefined // true
== '1' // true
true == 'true' // false
== 'NaN' // false
== // false
{"name": "imooc"} == {"name": "imooc"} // false
let a = {"name": "imooc"}
let b = a
console.log(a == b) // true
上面的中,列出了 ==
判断大部分场景,但是这样的判断方式存在严谨性,在类型不同的时候会做类型转换,这样不利于判断两个值是否真实相等。我们总结以下几点:
===
是严格相等的,被称作全等操作符,和 ==
很相似,区别在于 ===
不执行隐式类型转换。只有当两个操作值的值与类型都相等的前提下,才会返回 true
。但是一些操作值的判断还是会有问题:
+ === - // true
true === true // true
null === null // true
=== // false, NaN永远不等于NaN
=== '1' // false, 值类型不同:数值和字符串
true === 'true' // false
null === undefined // false
'Imooc' === 'imooc' // false, 严格区分大小写
null
上面的中,存在两个问题,+0 和 - 0 是全等的,虽然它们没有进行隐式转化,但是它们是带符号的,我们其实也不希望它们是相等的。NaN
不等于任何值,它自己,这样我们就无法判断两个 NaN 值相等了。根据上面的例子,我们可以总结以下几点:
Object.is()
被称为同值相等的比较,在两个值进行比较时用到了很多规则,比如上面 ===
在判断带符号的 0 时返回的都是 true
,NaN
和任何值都不相等,但 Object.is()
给出了截然相反的结果:
Object.is(, -); // false
Object.is(, ); // true
下面我们来看下,Object.is()
都有哪些规则:
let a
let b
Object.is(a,b) // true
Object.is('Imooc', 'Imooc') // true
Object.is('Imooc', 'imooc') // false
Object.is(null, 'null') // false
Object.is(undefined, 'undefined') // false
let a = {"name": "imooc"}
let b = a
Object.is(a, b) // true
Object.is({"name": "imooc"}, {"name": "imooc"}) // false
Object.is(window, window) // true, 只有window
Object.is(, +) // true
Object.is(, -) // false
Object.is(, ) // true
Object.is(, /) // true
本节讲解了判断两个值是否相同的 Object.is()
,这个弥补了使用等号(=)判断的不足,更加准确地判断两个值是否相同。同时处理 0 和 - 0 以及 NaN
值的判断,所以在开发中,尽量使用 Object.is()
去判断两个相同的值,会更加准确明了。