为什么不推荐使用JSON.stringify作深拷贝

咱们知道作深拷贝的时候能够使用递归的方式也能够用JSON.stringify + JSON.parse这种看起来简单的方式。
那么JSON.stringify + JSON.parse这种方式真的好用吗?
个人经验告诉我:
JSON.stringify + JSON.parse作深拷贝不安全,并且在大数据量的状况下存在性能问题,不推荐使用。
下面咱们主要围绕不安全的问题进行讨论,对于性能的问题简单提下。segmentfault

为什么不安全

不安全主要体如今两个方面:安全

  1. 拷贝过程当中数据失真、丢失
  2. 处理特殊数据时候报错

数据失真、丢失

数据失真,丢失主要在这几种类型中有体现函数

Date对象拷贝后数据类型变成字符串

let obj = {
    d: new Date(),
};
console.log(JSON.parse(JSON.stringify(obj)));
// {d: "2020-08-12T04:47:40.958Z"}

正则对象、Error对象拷贝后变成空对象

let obj = {
    r: /\d+/gi,
    e: new Error('an error')
};
console.log(JSON.parse(JSON.stringify(obj)));
// {r: {}, e: {}}

对象里面的函数和undefined属性拷贝后属性丢失

let obj = {
    f: console.log,
    u: undefined
};
console.log(JSON.parse(JSON.stringify(obj)));
// {}

NaN、Infinity、-Infinity拷贝后变为null

let obj = {
    i: Infinity,
    l: -Infinity,
    n: NaN,

};
console.log(JSON.parse(JSON.stringify(obj)));
// {i: null, l: null, n: null}

改变对象的原型链

若是,对象的某个属性是由构造函数生成的,那么在拷贝后,他的constructor会指向Object性能

var A = function () {
    this.a = 'a';
};
var a = new A();
var b = JSON.parse(JSON.stringify(a));
console.log(a.constructor, b.constructor);
// ƒ () {this.a = 'a'} ƒ Object() { [native code] }

特殊数据报错

这个简单的说就是若是对象中有环的话话就会报错,最简单的例子就是大数据

console.log(JSON.parse(JSON.stringify(window)));

这个就会报错,因此在使用这种方式作深拷贝的时候也要注意环的问题。this

为什么性能差

关于性能的问题我这里很少说,推荐《如何提高JSON.stringify()的性能》这篇文章,这篇文章对JSON.stringify的性能问题说的很清晰,我也很认同。code

参考文档

相关文章
相关标签/搜索