标签:对象 属性 一个 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