jQuery.extend()
方法用于合并两个或多个对象的内容到第一个对象中。这个方法可以用来覆盖对象的属性,也可以用来创建对象的副本。
jQuery.extend()
方法的基本语法如下:
jQuery.extend(deep, target, object1, [objectN]);
deep
(可选):布尔值,表示是否进行深拷贝。target
:目标对象,其他对象的属性将被合并到这个对象中。object1, objectN
:一个或多个源对象。deep
参数,可以选择是否进行深拷贝。jQuery.extend()
执行的是浅拷贝,即如果源对象的属性值是对象,则目标对象将得到对该对象的引用。deep
参数设置为 true
时,执行深拷贝,即递归地复制对象的所有层级。var obj1 = { a: 1, b: { c: 2 } };
var obj2 = { b: { d: 3 }, e: 4 };
jQuery.extend(obj1, obj2);
console.log(obj1); // { a: 1, b: { d: 3 }, e: 4 }
console.log(obj1.b === obj2.b); // true,obj1.b 和 obj2.b 指向同一个对象
var obj1 = { a: 1, b: { c: 2 } };
var obj2 = { b: { d: 3 }, e: 4 };
jQuery.extend(true, obj1, obj2);
console.log(obj1); // { a: 1, b: { c: 2, d: 3 }, e: 4 }
console.log(obj1.b === obj2.b); // false,obj1.b 是 obj2.b 的深拷贝
如果对象之间存在循环引用,深拷贝可能会导致栈溢出错误。
解决方法:
lodash
的 _.cloneDeep()
方法,它处理循环引用更好。function deepCopy(obj, hash = new WeakMap()) {
if (Object(obj) !== obj) return obj; // 原始类型直接返回
if (hash.has(obj)) return hash.get(obj); // 处理循环引用
let result = Array.isArray(obj) ? [] : {};
hash.set(obj, result);
Reflect.ownKeys(obj).forEach(key => {
result[key] = deepCopy(obj[key], hash);
});
return result;
}
var obj1 = { a: 1 };
obj1.b = obj1; // 循环引用
var obj2 = deepCopy(obj1);
通过这种方式,可以避免因循环引用导致的栈溢出问题。
领取专属 10元无门槛券
手把手带您无忧上云