Object.is()
方法通常用于需要进行严格相等比较的场景,特别是在处理一些特殊值时更为实用。以下是一些适合使用 Object.is()
的场景:
1 // (1)比较字符串 2 let str = '1' 3 let str1 = '1' 4 5 console.log(Object.is(str,str1)) //true 6 console.log(Object.is('str','str')) //true 7 console.log(Object.is('1',str))//true 8 console.log(Object.is('str','str1'))//false 9 10 // (2)比较数组 11 let arr = [] 12 let arr1 = [1,2] 13 let arr2 = [1,2] 14 console.log(Object.is(arr,arr1)) //false 15 console.log(Object.is(arr1,arr2)) //false//Object.is()
用于比较两个值是否严格相等,它并不支持比较数组。如果使用Object.is()
方法比较两个数组,结果始终是false
。
16 17 // (3)比较特殊对象undifined 和null 18 Object.is(null, null); //true 19 Object.is(undefined,undefined); //true 20 Object.is(undefined,null); //false 21 22 23 // (4)比较对象 24 let object = { 25 a :'1', 26 c : '3' 27 } 28 let obj = { 29 a :'1', 30 c : '3' 31 } 32 let obj1 = { 33 a :'1', 34 c : '5' 35 } 36 let obj2 = { 37 a :'1', 38 b : '2' 39 } 40 41 console.log(Object.is(obj,object)) 42 console.log(Object.is(obj,obj)) 43 console.log(Object.is(obj,obj1)) 44 console.log(Object.is(obj1,obj2)) 45 console.log(Object.is(obj,{a:'1',c:'3'})) 46 console.log(Object.is(obj,{a:'1',c:'6'}))
Object.is()
方法会根据以下规则进行比较:
- 如果两个值都是
undefined
,则它们被认为是相等的。 - 如果两个值都是
null
,则它们被认为是相等的。 - 如果两个值都是
true
或false
,则它们被认为是相等的。 - 如果两个值是相同的字符串,则它们被认为是相等的。
- 如果两个值是相同的数字(包括
NaN
),则它们被认为是相等的。 - 如果两个值引用同一个对象或函数,则它们被认为是相等的。
- 如果两个值都是
0
,并且具有相同的符号,则它们被认为是相等的。
除了上述规则外,Object.is()
对于 +0
和 -0
、NaN
和 NaN
的情况有一些特殊之处:
- 对于
+0
和-0
,使用Object.is()
会返回false
,而使用===
运算符会返回true
。 - 对于
NaN
,无论与任何值进行比较,包括自身,使用Object.is()
都会返回true
,而使用===
运算符会返回false
。
Object.is()
方法的原理可以简单描述如下:
- 首先,检查两个值是否是相同的字符串,数字,布尔值,
undefined
或null
,如果是,则按照上述规则返回相应结果。 - 接着,检查两个值是否为
+0
和-0
,如果是,则返回false
。 - 然后,检查两个值是否为
NaN
,如果是,则返回true
。 - 最后,检查两个值是否引用同一个对象或函数,如果是,则返回
true
。
总的来说,Object.is()
在需要进行严格相等比较并且需要处理特殊值或避免类型转换的情况下是一个有用的工具。它提供了一种更精准的比较方式,帮助开发人员准确地判断值之间的关系,避免由于类型转换而导致的意外结果。