`jQuery.extend` 是一个在 jQuery 中常用的函数,它用于将一个或多个对象的内容合并到目标对象。这个函数非常灵活,可以用于浅拷贝或深拷贝对象属性,具体取决于其参数的使用方式。
### 基本用法
#### 合并对象到目标对象(浅拷贝)
var object1 = {
apple: 0,
banana: { weight: 52, price: 100 },
cherry: 97
};
var object2 = {
banana: { price: 200 },
durian: 100
};
// 合并 object2 到 object1
$.extend(object1, object2);
console.log(object1);
// 输出: { apple: 0, banana: { price: 200 }, cherry: 97, durian: 100 }
// 注意: object1 中的 banana 对象的 price 属性被 object2 的 banana 对象的 price 属性覆盖,但 weight 属性保持不变(浅拷贝)
#### 使用空对象进行合并(创建新对象)
var object = $.extend({}, object1, object2);
console.log(object);
// 输出: { apple: 0, banana: { price: 200 }, cherry: 97, durian: 100 }
// 这是一个新的对象,包含了 object1 和 object2 的所有属性
### 深度拷贝
jQuery 从 1.4.0 版本开始,`$.extend` 允许使用布尔值作为第一个参数来指定是否进行深度拷贝。
var object1 = {
apple: 0,
banana: { weight: 52, price: 100 },
cherry: 97
};
var object2 = {
banana: { price: 200 },
durian: 100
};
// 深度拷贝 object2 到 object1
$.extend(true, object1, object2);
console.log(object1);
// 输出: { apple: 0, banana: { weight: 52, price: 200 }, cherry: 97, durian: 100 }
// 注意: 这次 banana 对象也被深度合并了,即 price 属性被覆盖,但 weight 属性保留
### 注意点
- 当使用深度拷贝时,如果源对象(object2)的属性值是原始值或函数,它们将被复制到目标对象(object1)。但如果源对象的属性值是对象或数组,则 jQuery 会递归地复制这些对象或数组。
- 深度拷贝时,如果源对象和目标对象有相同名称的嵌套对象,则源对象的嵌套对象会覆盖目标对象的嵌套对象,但只限于那些源对象嵌套对象中已存在的属性。
- 浅拷贝时,如果源对象和目标对象有相同名称的属性,并且这些属性指向对象或数组,则目标对象的属性将引用源对象的对象或数组(即不会复制对象或数组本身,而是复制引用)。