Object.is( )
Object.is 方法只能判断这两个对象的引用地址是否一致,但是要比对两个对象的内容是否相等时就不能用这个方法了
let obj1 = { a: 11, b: 22 } let obj2 = { a: 11111111111, b: 22222222222 } let obj3={a:11, b:22 } let obj4 = obj1 console.log('obj1 VS obj2:', Object.is(obj1, obj2));//false console.log('obj1 VS obj3:', Object.is(obj1, obj3));//false,两个对象没有指向同一内存 console.log('obj1 VS obj4:', Object.is(obj1, obj4));//true
在前端,判断两个对象的值是否相等时,如果是单纯判断无论如何都是不相等的,因为他们的内存地址不同,所以我们需要自己更深入去判断。
1. 当然是先最简单的 如果传入的不是复杂类型就直接判断两个值是否相等
let o1 = obj1 instanceof Object; let o2 = obj2 instanceof Object; if(!o1 || !o2) { // 如果不是对象 直接判断数据是否相等 return obj1 === obj2 }
2. 如果是复杂类型,那么判断两个对象的属性长度是否相等
if(Object.keys(obj1).length !== Object.keys(obj2).length) { return false; }
3. 如果两个对象属性长度相等,就判断属性的数据类型,根据不同数据类型作出操作
循环对象的属性判断是否对象, 如果是对象的话就继续回去判断,用`Object.prototype.toString.call()`比较严谨判断是什么类型
for(let attr in obj1) { let a1 = Object.prototype.toString.call(obj1[attr]) == '[object Object]' }
4.如果是数组的话,转换为字符串判断是否相等
let arr1 = Object.prototype.toString.call(obj1[attr]) == '[object Array]'
5.如果是普通数值直接判断是否相等即可
obj1[attr] !== obj2[attr]
整体测试代码:
<script> let obj1 = { name: 'amy', eat: { body: 1, say: 'kk' }, time: [1, 2, 3, 4, 5] } let obj2 = { name: 'amy', eat: { body: 1, say: 'kk' }, time: [1, 2, 3, 4, 5] } // let obj1 = { name: 'amy', eat: { body: 1, say: 'kk' }, time: [1, 2, 3, 4, 5] } // let obj2 = { name: 'ss', eat: { body: 1, say: 'kk' }, time: [1, 2, 3, 4, 5] } const isObjectEqual = (obj1, obj2) => { let o1 = obj1 instanceof Object; let o2 = obj2 instanceof Object; if (!o1 || !o2) { // 如果不是对象 直接判断数据是否相等 return obj1 === obj2 } // 判断对象的可枚举属性组成的数组长度 if (Object.keys(obj1).length !== Object.keys(obj2).length) { return false; } for (let attr in obj1) { let a1 = Object.prototype.toString.call(obj1[attr]) == '[object Object]' let a2 = Object.prototype.toString.call(obj2[attr]) == '[object Object]' let arr1 = Object.prototype.toString.call(obj1[attr]) == '[object Array]' if (a1 && a2) { // 如果是对象继续判断 return isObjectEqual(obj1[attr], obj2[attr]) } else if (arr1) { // 如果是对象 判断 if (obj1[attr].toString() != obj2[attr].toString()) { return false; } } else if (obj1[attr] !== obj2[attr]) { // 不是对象的就判断数值是否相等 return false } } return true } console.log(isObjectEqual(obj1, obj2)); </script>
标签:obj1,obj2,相等,attr,对象,Object,判断,let From: https://www.cnblogs.com/zhaofen/p/17120021.html