码迷,mamicode.com
首页 > 其他好文 > 详细

深拷贝与浅拷贝

时间:2018-04-27 02:28:39      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:对象   属性   一个   return   assign   ring   结构   isa   type   

深拷贝

$.extend(),设置为true是深拷贝

var x = {
    a: 1,
    b: { f: { g: 1 } },
    c: [ 1, 2, 3 ]
};

var y = $.extend({}, x),          //shallow copy
    z = $.extend(true, {}, x);    //deep copy

y.b.f === x.b.f       // true
z.b.f === x.b.f       // false

原生实现:
深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制(注意递归,引用类型有多层结构)到新对象上

function deepCopy(p,c){
    var i;
    c = c||{};
    for(i in p){
        if(p.hasOwnProperty(i)){
            if(typeof(p[i])==="object"){
                c[i] = Array.isArray(p[i])?[]:{};
                deepCopy(p[i],c[i]);
            }else{
                c[i] = p[i];
           }
        }
    }
    return c;
}

专门针对json对象的深拷贝:针对纯 JSON 数据对象的深复制,使用 JSON 全局对象的 parse 和 stringify 方法来实现深复制也算是一个简单讨巧的方法。然而使用这种方法会有一些隐藏的坑,它能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。

function jsonClone(obj) {
    return JSON.parse(JSON.stringify(obj));
}
var clone = jsonClone({ a:1 });

浅拷贝的方法

var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);

function shallowCopy(src) {
  var dst = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      dst[prop] = src[prop];
    }
  }
  return dst;
}

Object.assign(...)

var y = $.extend({}, x), //shallow copy


参考
https://github.com/LiuL0703/blog/issues/19
http://jerryzou.com/posts/dive-into-deep-clone-in-javascript/

深拷贝与浅拷贝

标签:对象   属性   一个   return   assign   ring   结构   isa   type   

原文地址:https://www.cnblogs.com/afterwawa/p/8955501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!