普通的浅克隆
for(let key in orgin) {} 会把原型链上的属性都克隆出来
let person = {
name: 'Terence',
age: 25,
sex: 'male',
height: 175,
weight: 63,
skill: ['html', 'css', 'js', 'node', 'webpack']
}
Object.prototype.num = 1
let copyOne = {}
function clone(target, orgin) {
for (let key in orgin) {
target[key] = orgin[key]
}
}
clone(copyOne, person)
console.log(copyOne, 'copyOne');
console.log(person, 'person');
所以要把原型链上的剔除出来
hasOwnProperty
function clone(target, orgin) {
for (let key in orgin) {
orgin.hasOwnProperty(key) && (target[key] = orgin[key])
}
}
深克隆
Object.prototype.toString
Object.prototype.toString 在对象的时候是【object Object】 数组是 【object Array】
1.首先判断是不是 null
Object.prototype.toString
function deepClone(target, origin) {
let toStr = Object.prototype.toString
let arrType = '[object Array]'
for (let key in origin) {
if (origin.hasOwnProperty(key)) {
console.log('key', key, toStr.call(origin[key]));
if (typeof (origin[key]) === 'object' && origin[key] !== null) {
// 引用值
if (toStr.call(origin[key]) === arrType) {
target[key] = []
} else {
target[key] = {}
}
deepClone(target[key], origin[key])
} else {
// 基础值
target[key] = origin[key]
}
}
}
}
还有一种方法是使用JSON
通过把一个引用值变成一个基本类型,然后JSON转为对象,指针的指向和原来的不一样了,但是有个问题就是
JSON不能存储方法
let str = JSON.stringify(Object)
let copyOne = JSON.parse(str)