deep_and_shallow_copy_js

  1. 深拷贝可以理解为递归进行浅拷贝。
  2. 简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级

浅拷贝实现

1.

1
2
3
4
5
6
7
8
9
10

function shallowClone (copyObj) {
var obj = {}
for (var prop in copyObj) {
if (copyObj.hasOwnProperty(prop)) {
obj[prop] = copyObj[prop]
}
}
return obj;
}

  1. Object.assign()

  2. Array的slice和concat方法

    • 它看起来像是深拷贝。而实际上它是浅拷贝: 如果该元素是个对象引用, 两个对象引用都引用了同一个对象, 所以会同变
    • 如果向两个数组任一中添加了新元素,则另一个不会受到影响

深拷贝的实现

  1. 对于字符串、数字及布尔值来说 没有深浅之分
  2. JSON对象的parse和stringify
    JSON.parse(JSON.stringify(source))
    这种方法使用较为简单,可以满足基本的深拷贝需求,而且能够处理JSON格式能表示的所有数据类型,
    但是对于正则表达式类型、函数类型等无法进行深拷贝(而且会直接丢失)。还有一点不好的地方是它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。同时如果对象中存在循环引用的情况也无法正确处理。

  3. Object.create(source)

    1
    2
    3
    4
    5
    6
    function copy(obj) {
    var F = function () {
    };
    F.prototype = obj;
    return new F();
    }

    是在方法内部创建了一个 function 原型指向传入的 old对象,再返回一个 function 实例,也就是拷贝出来的值,所以添加改变实例属性不会影响原型,但是修改 old 对象的属性值,也就是改变了实例的原型属性,新的对象的所有属性都是继承自 old 对象,自然会跟着变

参考

  1. https://github.com/wengjq/Blog/issues/3