咱们知道作深拷贝的时候能够使用递归的方式也能够用JSON.stringify + JSON.parse
这种看起来简单的方式。
那么JSON.stringify + JSON.parse
这种方式真的好用吗?
个人经验告诉我:JSON.stringify + JSON.parse
作深拷贝不安全,并且在大数据量的状况下存在性能问题,不推荐使用。
下面咱们主要围绕不安全的问题进行讨论,对于性能的问题简单提下。segmentfault
不安全主要体如今两个方面:安全
数据失真,丢失主要在这几种类型中有体现函数
let obj = { d: new Date(), }; console.log(JSON.parse(JSON.stringify(obj))); // {d: "2020-08-12T04:47:40.958Z"}
let obj = { r: /\d+/gi, e: new Error('an error') }; console.log(JSON.parse(JSON.stringify(obj))); // {r: {}, e: {}}
let obj = { f: console.log, u: undefined }; console.log(JSON.parse(JSON.stringify(obj))); // {}
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