==、===、Object.is()的区别

104 阅读2分钟

==、===、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

  1. 都为undefined
  2. 都是null,
  3. 都是true或者false
  4. 都是相同长度的字符串并且相同字符按照相同的顺序排序
  5. 都是相同的对象(同一个引用地址)
  6. 都是数字,且大都是+0,或者是-0,或者都是NaN或者都是非零而且非NaN且为同一个值。

总结

  1. Object.is()与==运算不同之处在于==需要做类型转化,但是Object.is()不需要做类型转化。
  2. Object.is()与===运算不同之处在于,===中+0与-0是相同,NaN和NaN不同。在Object.is()下,+0和-0不同,NaN和NaN相同