深拷贝也是面试中的高频题,概念省略,直接上方法!!!
浅拷贝
1.扩展运算符:...
const arr2 = [...arr]
2.Object.assign: 将后面任意多个对象合并到target对象上
Object.assign(target, ...sources)
深拷贝
1.可以通过 JSON.parse与JSON.stringify来解决
JSON.parse(JSON.stringify(object))
2.自己封装一个深拷贝的函数:
当你回答了json的这两个方法后,面试官百分百会问你还有呢,这时,你就得自己如何写的了,
1.基础版:一般面试说这个就行了
function deepClone1(data) {
if (data !== null && typeof data === "Object") {
const clone = Array.isArray(data) ? [] : {};
for (let key in data) {
if (data.hasOwnProerty(key)) {
clone[key] = aUtils.deepClone1(data[key]);
}
}
return clone;
} else {
return data;
}
}
2. 在基础版的基础上,使用es6的map,提高了遍历的性能
function deepClone2(data, map = new Map()) {
if (data !== null && typeof data === "object") {
let clone = map.get(data);
if (clone) {
return clone;
}
// 数组
if (Array.isArray(data)) {
clone = [];
map = map.set(data, clone);
data.forEach((item, index) => {
clone[index] = aUtils.deepClone2(item, map);
});
} else {
// 对象
clone = {};
map = map.set(data, clone);
for (var key in data) {
if (data.hasOwnProerty(key)) {
clone[key] = aUtils.deepClone2(data[key], map);
}
}
}
return clone;
} else {
return data;
}
}
3.项目中经常使用的一种:
function deepClone(data) {
var type = getObjType(data);
var obj;
if (type === 'array') {
obj = [];
} else if (type === 'object') {
obj = {};
} else {
//不再具有下一层次
return data;
}
if (type === 'array') {
for (var i = 0, len = data.length; i < len; i++) {
obj.push(deepClone(data[i]));
}
} else if (type === 'object') {
for (var key in data) {
obj[key] = deepClone(data[key]);
}
}
return obj;
};
可能还有其他的方法,在这里就不列举了,我只把我知道的写出来了!!!