今天的code rewiew , 看到了如下的代码来实现深拷贝的效果。
var a = {name:'demo'};
var c = JSON.parse(JSON.stringify(a))
其实这样的实现,看似是解决了问题:防止数据的意外篡改。但是,其实有很多的隐患。
性能
首先是前端性能问题,这样做,对浏览器的性能消耗其实是很大的。尤其是在页面频繁render的时候,方法被重复调用,严重的话可能会导致浏览器的卡顿。
缺陷
通过序列化和反序列化的方式,来实现数据的深拷贝,对于普通的对象或者数组来说,本身没有什么问题,但是对于一些特殊的类型,其实是有缺陷的,比如NaN,比如Inifinity:
var a = {name:NaN,code:Infinity};
var c = JSON.parse(JSON.stringify(a))//{name: null, code: null}
而且如果出现循环引用的问题,同样是不可靠的。
总结
仅仅综合这几点的话,我们在日常的开发中,就应该规避这种情况。解决的方法就是抛弃需要 deep clone 的代码。
而且对于数据的修改,你本身应该就是能够预期的,在这种情况下,我们也可以针对某些数据,替换覆盖,而不是粗暴的去深拷贝。