Object.is()和原来的“===“,“==“之间的区别?

x33g5p2x  于2022-02-24 转载在 其他  
字(1.8k)|赞(0)|评价(0)|浏览(341)

一、==
双等号判等,会在比较时进行类型转换。
1、如果操作数都是对象,则仅当两个操作数都引用同一个对象时才返回true。

  1. const obj = {name:"张三", age:20}
  2. const obj2 = obj
  3. console.log({name:"张三", age:20} == obj) //false
  4. console.log(obj2 == obj) //true

2、如果一个操作数是null,另一个操作数为undefined,则也返回true

  1. console.log(null == undefined) //true

3、如果两个操作数是不同的类型,就会在进行比较之前进行类型的转换,将其转换为不同的类型。

  1. 1、当数字和字符串进行比较时,会尝试将字符串转化为数字。
  2. console.log("1221" == 1221) //true
  3. 2、如果操作类型为布尔值,会将true转换为1false转化为0
  4. console.log(true == 1) //true
  5. console.log(false == 0) //true
  6. 3、如果操作数之一为对象,另一个是数字或者字符串,会尝试使用valueOf()和toString()方法将对象转化为原始值。
  7. console.log(Number(10) == 10)
  8. console.log(Number(10))

4、如果操作数的类型相同

  1. 1String类型仅当两个操作数具有相同顺序的字符才返回true
  2. 2Number类型,仅当两者具有相同的值时才返回true,+0和-0被视为相同的值。如果任何一个操作数为NaN,则直接返回false.
  3. console.log(+0 == -0) //true
  4. console.log(NaN == NaN) //false

二、===
三等号判断,比较时不进行隐式类型转化,类型不同则返回false。

  1. 1、如果操作数的类型不同,则返回false
  2. console.log("12" === 12) //false
  3. 2、如果两个操作数都是对象时,只有当他们都指向同一个对象时才返回true.
  4. 3、如果两个操作数都是null,或者两个操作数都是undefined,返回true.
  5. console.log(null === null) //true
  6. console.log(undefined === undefined) //true
  7. 4、如果存在NaN,则返回false
  8. console.log(NaN === NaN) //false
  9. 5、+0和-0在三等号下是相等的。
  10. console.log(+0 === -0) //true。

三、Object.is()
Object.is()和三等运算符很像,但是仍然存在一些差别,比如说对于NaN,对于+0和-0之间的比较

  1. console.log(Object.is(10, 10)) //true
  2. console.log(Object.is(NaN, NaN)) //true
  3. console.log(Object.is({}, {})) // false
  4. console.log(Object.is(12, "12")) //false
  5. console.log(Object.is(true, 1)) //false
  6. console.log(Object.is(false, false)) //true
  7. console.log(Object.is(+0, -0)) //false
  8. console.log(Object.is(undefined, null)) //false

满足如下条件的Object.is()的返回值为true.
1.、都为undefined
2、都是null
3、都是true或者都是false.
4、都是相同长度的字符串并且相同字符换按照相同的顺序排列
5、都是相同的对象(同一个引用)
6、都是数字,且大都是+0,或者都是-0,或者都是NaN或者都是非零而且非NaN且为同一个值
四、总结
Object.is()==运算不同之处在于==需要做类型转化,但是Object.is()不需要做类型转化。
Object.is()===运算不同之处在于,在===下,+0-0相同,NaNNaN不同,在Object.is()下,+0和-0不相同,NaN和NaN相同。

相关文章