声明本文摘抄《你不知道的javascript》上卷 110页。
如何复制一个对象,看起来应该有一个内置的copy()方法。实际上事情比你想象的更复杂,因为我们无法选择一个默认的复制算法。
比如下面这个对象

function fn (){}
var obj = {
    c: true
}
var array = [];
var myObj = {
    a: 2,
    b: obj,
    c: array,
    d: fn
};
array.push(obj, myObj)

如何复制myObj对象呢?

  1. 首先我们应该判断它是浅复制还是深复制。
    对于浅复制来说,复制出的新对象中a的值会是旧对象中的值,就是2,但是新对象中b、c、d三个属性其实只是三个引用,他们和旧对象中b、c、d引用的对象是一样的。
    对于深复制来说,除了复制myObj以外还会复制obj、array.这时问题就来了,array引用了obj和myObj,所以又需要复制myObj,这样就会导致死循环。

    思考:复制一个函数意味着什么呢?有些人会通过toString()来序列化一个函数的源码(但是结果取决于js的具体实现,而且不同的引擎对于不同类型的函数处理方式并不完全相同)。
    对于JSON安全(也就是说可以被序列化为一个JSON字符串并且可以根据这个字符串解析出一个结构和值完全一样的对象)的对象来说,有一种巧妙的复制方法:

var newObj = JSON.parse(JSON.stringify(someObj));

这个方法需要保证对象是JSON安全的,所以只适用于部分情况。

相对于深复制,浅复制非常易懂而且问题少的多。所以es6定义了object.assign()方法来实现浅复制。

object.assign({}, myObj);




大煜儿
103 声望7 粉丝

用心走路,给每一个细节打一个结。