js对象深度相同
- 什么叫做 对象深度相同 ?,就是 两个对象一模一样,但是又不是同一个对象
- 举个例子:const p1 = { name:“zhangsan” },p2 = { name:“zhangsan” },p1和p2长得一模一样,但是 因为他们的引用不同,所以不是一个对象,如果你想让他们成为同一个对象也很简单,直接 p1=p2 就可以了,但是 这里要讲的是,如何才能检验两个长得一模一样的对象,但是这两个对象又不是一个对象,就好比双胞胎,长得一模一样但是不是同一个人
- 之前定义过 深度克隆 deepClone() 函数,现在 自定义一个专门用来检验两个长得一模一样的对象的函数,也就是 深度相同函数,即 deepEqual() 函数
话不多说,直接上代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>深度相同</title>
</head>
<body>
<script>
if(!Object.deepEqual){
Object.deepEqual = function(o1,o2){
const o1Arr = Object.keys(o1)
const o2Arr = Object.keys(o2)
const len = o1Arr.length
if(o1Arr.length === o2Arr.length){
for(let i=0;i < len;i++){
if(o2.hasOwnProperty(o1Arr[i])){
if(Object.prototype.toString.call(o1[o1Arr[i]]) === "[object Object]"){
// 说明这个属性是一个对象
if(!Object.deepEqual(o1[o1Arr[i]],o2[o1Arr[i]])){
return false
}
}else{
// 说明属性是一个值,不是一个对象
if(!(o1[o1Arr[i]] === o2[o1Arr[i]])){
// throw new Error("propertyValue different!")
return false
}
}
}else{
// throw new Error("property different!")
return false
}
}
}else{
// throw new Error("propertyLength different!")
return false
}
return true
}
}
if(!Object.deepClone){
Object.deepClone = function(target,source){
for(let property in source){
if(Object.prototype.toString.call(source[property]) === "[object Object]"){
target[property] = Object.deepClone({},source[property])
}else{
target[property] = source[property]
}
}
return target
}
}
const zhangsan = {
name:"zhansgan",
gender:"man",
age:23,
job:"student",
hobby:{ name:"basketball" }
}
const lisi = Object.deepClone({},zhangsan)
console.log(lisi)
// lisi.hobby.name = "football"
console.log(zhangsan)
console.log(zhangsan == lisi)
console.log(Object.deepEqual(zhangsan,lisi))
</script>
</body>
</html>
- 测试结果如图:
- 大功告成…