JSON.parse(JSON.stringify())实现深拷贝时有什么缺点JSON.parse(JSON.stringify ())在实现深拷贝时是有⼀些弊端的。
有以下⼏种情况时,不能正确的进⾏深拷贝:
1、obj⾥⾯有new Date(),深拷贝后,时间会变成字符串的形式。⽽不是时间对象;
var a ={
name:'a',
date:[new Date(1536627600000),new Date(1540047600000)],
};
let b;
b =JSON.parse(JSON.stringify(a))
console.log(a,b)
2、obj⾥有RegExp、Error对象,则序列化的结果会变成空对象{};
const a ={
name:'a',
date:new RegExp('\\w+'),
};
// debugger
error parse newconst b =JSON.parse(JSON.stringify(a));
a.name ='test'
console.log( a, b)
3、obj⾥有function,undefined,则序列化的结果会把function或 undefined丢失;
const a ={
name:'a',
date:function hehe(){
console.log('fff')
},
};
// debugger
const b =JSON.parse(JSON.stringify(a));
a.name ='test'
console.log(a, b)
4、obj⾥有NaN、Infinity和-Infinity,则序列化的结果会变成null;
const a ={
name:'a',
date:NaN,
};
// debugger
const b =JSON.parse(JSON.stringify(a));
a.name ='test'
console.log(a, b)
5、JSON.stringify()只能序列化对象的可枚举的⾃有属性,如果obj中的对象是由构造函数⽣成的实例对象, 深拷贝后,会丢弃对象的constructor;
function Person(name){
this.name=name;
}
var person =new Person('jyy')
const a ={
name:'a',
date: person,
};
// debugger
const b =JSON.parse(JSON.stringify(a));
a.name ='test'
console.log(a, b)
6、如果对象中存在循环引⽤的情况也⽆法正确实现深拷贝;那么, 以上的6种情况怎么实现深拷贝呢?看下⾯的代码:
//实现深拷贝函数
function deepClone(data){
const type =this.judgeType(data);
let obj =null;
if(type =='array'){
obj =[];
for(let i =0; i < data.length; i++){
obj.push(this.deepClone(data[i]));
}
}else if(type =='object'){
obj ={}
for(let key in data){
if(data.hasOwnProperty(key)){
obj[key]=this.deepClone(data[key]);
}
}
}else{
return data;
}
return obj;
}
function judgeType(obj){
// tostring会返回对应不同的标签的构造函数
const toString = String;
const map ={
'[object Boolean]':'boolean',
'[object Number]':'number',
'[object String]':'string',
'[object Function]':'function',
'[object Array]':'array',
'[object Date]':'date',
'[object RegExp]':'regExp',
'[object Undefined]':'undefined',
'[object Null]':'null',
'[object Object]':'object',
};
if(obj instanceof Element){
return'element';
}
return map[toString.call(obj)];
}
const test ={
name:'a',
date:[1,2,3]
};
console.log(deepClone(test))
test.date[0]=6;
console.log(test);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论