==、===、Object.is()的区别
双等号判断、会在比较时进行类型转换(通过valueOf)
- 如果操作数都是对象,则仅当两个操作数都引用同一个对象时才返回true
const obj = {name:"张三", age:20}
const obj2 = obj
console.log({name:"张三", age:20} == obj) //false
console.log(obj2 == obj) //true
- 如果一个操作数是null,另一个操作数是undefined,则也返回true
console.log(null == undefined) //true
- 如果两个操作数是不同的类型,会在进行比较之前进行类型的转换,将其转换为相同的类型
//当数字和字符串进行比较时,会尝试将字符串转化为数字。
console.log("1221" == 1221) //true
//如果操作类型为布尔值,会将true转换为1,false转化为0。
console.log(true == 1) //true
console.log(false == 0) //true
//如果操作数之一为对象,另一个是数字或者字符串,会尝试使用valueOf()和toString()方法将对象转化为原始值。
console.log(Number(10) == 10)
console.log(Number(10))
- 如果操作数的类型相同
//String类型仅当两个操作数具有相同顺序的字符才返回true。
//Number类型,仅当两者具有相同的值时才返回true,+0和-0被视为相同的值。如果任何一个操作数为NaN,则直接返回false.
console.log(+0 == -0) //true
console.log(NaN == NaN) //false
三等号判断,比较时不进行隐式类型转化,类型不同则返回false
//如果操作数的类型不同,则返回false。
console.log("12" === 12) //false
//如果两个操作数都是对象时,只有当他们都指向同一个对象时才返回true.
//如果两个操作数都是null,或者两个操作数都是undefined,返回true.
console.log(null === null) //true
console.log(undefined === undefined) //true
//如果存在NaN,则返回false。NaN表示的是非数字, 但是这个非数字也是不同的,因此,NaN 不等于 NaN,并且两个NaN永远不可能相等。
console.log(NaN === NaN) //false
//+0和-0在三等号下是相等的。
console.log(+0 === -0) //true。
Object.is()和三等运算符很像,但是仍然存在一些差别,比如说对于NaN,对于+0和-0之间的比较。
console.log(Object.is(10, 10)) //true
console.log(Object.is(NaN, NaN)) //true
console.log(Object.is({}, {})) // false
console.log(Object.is(12, "12")) //false
console.log(Object.is(true, 1)) //false
console.log(Object.is(false, false)) //true
console.log(Object.is(+0, -0)) //false
console.log(Object.is(undefined, null)) //false
满足如下条件的Object.is()的返回值为true
- 都为undefined
- 都是null,
- 都是true或者false
- 都是相同长度的字符串并且相同字符按照相同的顺序排序
- 都是相同的对象(同一个引用地址)
- 都是数字,且大都是+0,或者是-0,或者都是NaN或者都是非零而且非NaN且为同一个值。
总结
- Object.is()与==运算不同之处在于==需要做类型转化,但是Object.is()不需要做类型转化。
- Object.is()与===运算不同之处在于,===中+0与-0是相同,NaN和NaN不同。在Object.is()下,+0和-0不同,NaN和NaN相同