前言
因为引用类型的变量所指向的是内存地址的引用,所以简单的赋值操作只是讲原本引用类型的引用赋值到了新的变量之上。
浅拷贝
ES3 的写法
var a = {
a: 1,
b: 2
}
function cloneObj (obj) {
var res = {};
for (var key in obj) {
res[key] = obj[key]
}
return res;
}
ES5 (偏向底层)
function cloneObj (obj) {
var res = {};
Object.getOwnPropertyNames(obj).forEach(function (key) {
var descrition = Object.getOwnPropertyDescriptor(obj, key);
Object.defineProperty(res, key, descrition);
});
return res;
}
ES6
const cloneObj = (obj) => {
const res = {};
for (let [key, value] in Object.entries()) {
res[key] = value;
}
return res;
}
深拷贝
递归对象的每一个属性
const deepClone = (obj, deepRes) => {
const res = deepRes || {};
for (let key in obj) {
if (typeof(obj[key]) === 'object' && obj[key] !== null) {
res[key] = Array.isArray(obj[key]) ? [] : {};
deepClone(obj[key], res[key])
} else {
res[key] = obj[key]
}
}
return res;
}