深拷贝
创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“复制”而不是“引用”
注:该代码只能够传对象和数组,其他类不行。
一丶
const add={ //定义的一个对象
name:"小灰灰",
age:9,
sex:{sex:"男"},
arr:["a","b","c"]
}
//递归函数
function deepClone(obj){
//obj 是 null ,或者不是对象和数组,直接返回
if(typeof obj!== "object"||obj==null){
return obj;
}
let result //初始化变量
//判断是不是一个数组
if(obj instanceof Array){
result=[]
}else{
result={}
}
//循环obj
for(let key in obj){
//判断 key 不是一个原型属性
if(obj.hasOwnProperty(key)){
//调用递归函数
result[key]=deepClone(obj[key])
}
}
//返回数据
return result
}
//将add拷贝到obj1中
const obj1=deepClone(add)
console.log(obj1.arr) //打印结果 ["a","b","c"]
//给数据arr的第一个值重新赋值
obj1.arr[0]="d"
console.log(obj1.arr) //打印结果 ["d","b","c"]
console.log(add.arr) //打印结果 ["a","b","c"]
二丶
Object.prototype.clone = function () {
//判断内置属性arguments是不是一个数组,不是数组就是对象
var a = this.constructor === Array ? [] : {}
//构造函数中this指向调用它的对象
for (var e in this) {
// 判断this中的每一项是否等于对象,是克隆,不是返回
a[e] = typeof this[e] === 'object' ? this[e].clone() : this[e]
}
return a
}
let arr = [1, [{ name: "小灰灰", age: "12" }, { sex: "男" }]]
//arr1克隆arr
let arr1 = arr.clone()
arr[1][1].name="辉太郎"
console.log(arr, arr1)
打印结果
总结
希望各位,路过的朋友,多多指教。