有哪些判断相等性的方法
JavaScript现在提供了三种方法来判断相等性:
- ===,三个等号即严格相等
- ==,两个等号即宽松相等
- Object.is(),ES6中用来判断相等的方法
判断相等性的细节
===(严格相等)
被比较的两个数不会进行类型转换,具体的比较过程如下:
- 不同类型的值:直接返回false
- 同一类型的基本类型的值:比较值是否相同,相同就返回true,不相同就返回false,有一个例外NaN === NaN返回false
- 同一类的复合类型的值:比较它们是否指向同一个对象,是就返回true,否则返回false
例子:
var a = 2, b = '2' a === b // false undefined === null // false NaN === NaN // false +0 === -0 // true var f = function(){} var c = f, d = f; c === d // true 复制代码
==(宽松相等)
宽松相等主要是在某些情况下涉及到隐式类型转换的问题,废话不说,看一下MDN上面对宽松相等的规则总结:
总结一下就是:
- 类型相同时,结果和===一样
- undefined和null互相比较时为true,但是它们和其他类型比较时都为false
- 原始类型A和原始类型B比较时:ToNumber(A) === ToNumber(B)
- 原始类型A和复合类型B比较时:ToNumber(A) == ToPrimitive(B)
那么ToNumber和ToPrimitive这两个方法内部到底是如何判断的呢?查看一下ECMA说明
如果是这么个意思:
ToNumber
- undefined,返回NaN
- null,返回+0
- boolean,true返回1,false返回+0
- number,直接返回自身
- string,将字符串的内容转换为数字,转换失败则返回NaN。例如"123"这样的就是返回123,"213a"这样的返回NaN
- symbol,抛出typeerror错误
- object,先调用toPrimitive,再对其结果调用toNumber
ToPrimitive
首先这个方法有两个参数,input和preferredType,如果preferredType是number的话,大致过程如下:
- 如果input就是原始类型,直接返回其自身
- 调用input.valueOf(),如果结果是原始类型,则返回该结果
- 调用input.toString(),如果结果是原始类型,则返回该结果
- 抛出typeerror错误
如果preferredType是string,那么第2步和第3步顺序反过来。
如果preferredType没有传入的话:
- 如果input是Date类型,则preferredType取string
- 否则,preferredType取number
Object.is
这个方法大致和===一样,除了以下:
- Object.is(NaN, NaN) 返回true
- Object.is(+0, -0) 返回false
参考
知乎-Javascript 中 == 和 === 区别是什么?