浅拷贝和深拷贝
浅拷贝:浅克隆之所以被称为浅克隆,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.
1.第一种方法:
function shadowClone(o) {
const obj = {};
for (let i in o) {
obj[i] = o[i];
}
return obj;
}
var oldObj = {
a: 1,
b: 3,
c: [1, 3, 5, 7, 9]
};
var newObj = shadowClone(oldObj);复制代码
第二种:
var oldObj = {
a: 1,
b: 3,
c: [1, 3, 5, 7, 9]
};
var newObj1 = Object.assign({}, oldObj);复制代码
深拷贝
深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”
// 深拷贝 // 获取类型
function getType(obj) {
var toString = Object.prototype.toString;
var map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Null]': 'null',
'[object Undefined]': 'undefined',
'[object Array]': 'array',
'[object Function]': 'function',
'[object RegExp]': 'regExp',
'[object Date]': 'date',
'[object Object]': 'object'
}
if (obj instanceof Element) {
// 因为对不同标签,toString会返回对应不同标签的构造函数
return 'element';
}
return map[toString.call(obj)];
}
function deepClone(data) {
var type = getType(data)
var obj;
if (type === 'array') {
obj = []
for (var i = 0; i < data.length; i++) {
obj.push(deepClone(data[i]))
}
} else if (type === 'object') {
obj = {}
for (var key in data) {
obj[key] = deepClone(data[key]);
}
} else {
obj = data;
}
return obj;
}
var oldObj = {
a: 1,
b: 2
}
const newObj = deepClone(oldObj);
const newObj1 = newObj.c = 4;
console.log(oldObj, newObj)
let oldData = [1, 2, 3, 4, 4];
const newData = deepClone(oldData);
const newData1 = newData.push({ a: 4, b: 7 });
console.log(newData, '--->newData', oldData, '---->oldData');复制代码
转载于//juejin.im/post/5ce49505e51d4510bf1d65e1
还没有评论,来说两句吧...