关于深拷贝,浅拷贝的观点不多说,观点能够自行百度哟!这里对深拷贝对象举行一些研讨!
只要值范例数据的深拷贝
针对只要值的数据对象,下面一行代码足以!
JSON.parse(JSON.stringify(obj))
不严谨的简朴的深拷贝
function clone(source) {
var target = {};
for(var i in source) {
if (source.hasOwnProperty(i)) {
if (typeof source[i] === 'object') {
target[i] = clone(source[i]); // 注重这里
} else {
target[i] = source[i];
}
}
}
return target;
}
题目存在:
- 没有对参数做磨练
- 推断是不是对象的逻辑不够严谨
- 没有斟酌数组的兼容
进阶深拷贝
function isObj(obj)
{
return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
}
function deepCopy(obj)
{
let tempObj = Array.isArray(obj) ? [] :{};
for(let key in obj)
{
tempObj[key] = isObj(obj[key]) ? deepCopy(obj[key]) : obj[key];
}
return tempObj;
}
题目存在:
- 拷贝环,也就是对 对象轮回援用 的拷贝出现题目
针对环的深拷贝
能够运用一个WeakMap构造存储已被拷贝的对象,每一次举行拷贝的时刻就先向WeakMap查询该对象是不是已被拷贝,假如已被拷贝则掏出该对象并返回,将deepCopy函数改形成以下:
function isObj(obj)
{
return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
}
function deepCopy(obj, hash = new WeakMap()) {
if(hash.has(obj)) return hash.get(obj)
let cloneObj = Array.isArray(obj) ? [] : {}
hash.set(obj, cloneObj)
for (let key in obj) {
cloneObj[key] = isObj(obj[key]) ? deepCopy(obj[key], hash) : obj[key];
}
return cloneObj
}
题目存在:
- 没有斟酌对new Date(),正则,函数范例的对象的拷贝
连系环,针对date,reg,箭头函数范例的深拷贝
const obj = { arr: [111, 222], obj: {key: '对象'}, a: () => {console.log('函数')}, date: new Date(), reg: /正则/ig}
function isObj(obj)
{
return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
}
function deepCopy(obj, hash = new WeakMap()) {
let cloneObj;
let Constructor = obj.constructor;
switch(Constructor){
case RegExp:
cloneObj = new Constructor(obj)
break;
case Date:
cloneObj = new Constructor(obj.getTime())
break;
case Function:
cloneObj = eval(obj.toString());
break;
default:
if(hash.has(obj)) return hash.get(obj)
cloneObj = new Constructor()
hash.set(obj, cloneObj)
}
for (let key in obj) {
cloneObj[key] = isObj(obj[key]) ? deepCopy(obj[key], hash) : obj[key];
}
return cloneObj;
}
const cloneObj = deepCopy(obj);
console.log(cloneObj);
更多遗留题目,针对函数举行拷贝,如果function,非箭头函数,怎样处理?另有,若要拷贝原型链上的属性?怎样拷贝不可枚举属性? 怎样拷贝Error对象等等的坑?