克隆与深度克隆

1.浅克隆

var lilei = {
sname: "lilei",
sage: 20,
intr() {
console.log(`我是${this.sname},今年${this.sage}`);
}
}
// lilei.intr()

function clone(obj) {
var newObj = {};
for (var key in obj) {
newObj[key] = obj[key];
}
return newObj;
}
var hmm = clone(lilei);
console.log(hmm);

2.深度克隆

function checkType(data) { // 用来判断被拷贝对象数据类型的函数
return Object.prototype.toString.call(data).slice(8, -1)
}
function deepClone(target) { // 实现深度拷贝的函数
var result, targetType = checkType(target);//Array Object
if (targetType === 'Object') { // 只有对象和数组才进行深度拷贝
result = {}
} else if (targetType === 'Array') {
result = []
} else {//如果return 证明target是基本数据类型,并且将整个函数结束了
return target
}
for (var i in target) { // i为对象的key或数组的下标
//获取属性名为i的属性值
var value = target[i]
// 检测当前属性的类型
var valueType = checkType(value);//String Number Array
if (valueType === 'Object' || valueType === 'Array') {
result[i] = deepClone(value) // 当拷贝的对象中还有数组或是对象时进行递归,克隆它们中的内容,直到递归完所有数组或对象为止
} else {
result[i] = value
}
}
return result // 返回最终的结果
}
var arr = [1,2,{username:"xiaohu"}]
var arr2 = deepClone(arr)
arr2[2].username = "dahu"
console.log(arr)
console.log(arr2)

原文地址:https://www.cnblogs.com/zhanghaifeng123/p/12046074.html