深拷贝
let obj = {
name: 'james',
age: 23,
height: 198,
color: ['red', 'green', 'yellow', 'deeppink'],
firends: {
name: 'xiaoming',
age: 23
},
hope: function () {
console.log('movies');
},
__proto__: {
happy: function () {
}, eat: function () {
} }
}
let obj1 = {} function deepClone(target, origin) { var target = target || [], toStr = Object.prototype.toString, arrStr = "[object Array]"; //首先进行对象遍历 for ...in 循环 for (var key in origin) { // 使用hasOwnProperty是排除掉对象__proto__ 我们一般克隆不会去克隆这个里边的属性方法 if(origin.hasOwnProperty(key)) { // 判断是不是对象 是对象再判断是数组还是对象 不是对象直接把值给到新的对象 if(typeof(obj[key]) === 'object') { if(toStr.call(origin[key]) === arrStr) { target[key] = [] }else { target[key] = {} } //这里边比较绕的是 当判断是对象或者数组的时候 要新建一个对象或数组 这个时候 进行递归 直到找到出口 就是是原始类型 这块不是明白的建议看下相关拷贝的视频课程 deepClone(target[key], origin[key]) }else { target[key] = origin[key] } } } return target } deepClone(obj1, obj)
}, eat: function () {
} }
}
let obj1 = {} function deepClone(target, origin) { var target = target || [], toStr = Object.prototype.toString, arrStr = "[object Array]"; //首先进行对象遍历 for ...in 循环 for (var key in origin) { // 使用hasOwnProperty是排除掉对象__proto__ 我们一般克隆不会去克隆这个里边的属性方法 if(origin.hasOwnProperty(key)) { // 判断是不是对象 是对象再判断是数组还是对象 不是对象直接把值给到新的对象 if(typeof(obj[key]) === 'object') { if(toStr.call(origin[key]) === arrStr) { target[key] = [] }else { target[key] = {} } //这里边比较绕的是 当判断是对象或者数组的时候 要新建一个对象或数组 这个时候 进行递归 直到找到出口 就是是原始类型 这块不是明白的建议看下相关拷贝的视频课程 deepClone(target[key], origin[key]) }else { target[key] = origin[key] } } } return target } deepClone(obj1, obj)
1、思路 :
- 首先遍历对象 for in 循环
- 判断是否原始值 typeof object
- 判断是数组还是对象 这里使用对象原型上toString方法
- 建立相对应的数组对象
- 再次进行递归