我们都知道js在copy的时候会有一些问题,特别是数据中存在引用类型的状态下,copy的数据又些类型可能会发生改变。以下是我们经常会用到的一些copy的方式,也都存在一些问题,我们需要按照不同的场景来使用合适是方式。
1.
let obj2 = JSON.parse(JSON.stringify(obj1))
问题: 1.Date序列化的结果是字符串,还原之后还是字符串;
2.Function、RegExp、Error对象和undefined值不能序列化和还原;
3.NaN、Infinity、-Infinity序列化的结果是空;
4.只能序列化对象可枚举属性;
5. 会无意间改变一些数据类型,且无法copy Function 类型,
2.
Object.assigin()
问题: 只能copy一层,嵌套的对象类型则不行
3. 递归遍历对象
function copy(dest){
if(typeof dest === 'object'){
if(!dest) return dest; // null
var obj = dest.constructor(); // Object/Array
for(var key in dest){
obj[key] = copy(dest[key])
}
return obj;
} else {
return dest;
}
}
这里调用原型链构造函数,限定条件相当于制执行Array()或Object()构造一个复杂空对象。同时这俩有个特点,是不需要new。整个函数实际上有个限定条件,就是只对Object和Array做深copy,也就是JSON的数据结构范围。其他对象不递归,也没处理循环引用。
问题: 1.递归引用的处理; 2. 特殊对象的处理(如Date); 3. Symbol属性的处理