我观察到jQuery的$.extend
方法和引用数组(在JavaScript中被认为是对象)中的一个奇怪的问题。
我使用缺省对象,定义如下:
var defaults = {
numbers: []
};
我有一个配置选项,然后传递一个函数,定义如下:
var config = {
numbers: [1, 2, 3]
};
在一个函数中,我扩展了这两个(使用深度$.extend
):
function configure(settings) {
var nums = $.extend(true, {}, defaults, settings);
nums.numbers.push(4);
console.log(settings, nums);
}
configure(config);
当我记录这两个时,结果如下:
settings: {"numbers":[1,2,3]}
nums: {"numbers":[1,2,3,4]}
我不明白的是,jQuery从左到右合并对象。
我希望,因为设置是最后一个对象扩展,在nums
中创建的数字数组是对settings.numbers
的引用(因为settings
是$.extend
编辑的最后一个对象)。但事实并非如此(当我记录最终结果时,您可以看到)。
谁能解释一下为什么?这是一个很难在我的应用程序中找到bug的原因,所以我想确保我理解它,这样它就不会再发生了。
你进行了深度合并:
在深度扩展上,Object和Array被扩展为
目标对象是deep
布尔值之后的第一个对象。
在你的情况下,它是{}
,也nums
,因为你的分配。
settings
不是目标对象。因此,它的numbers
数组不是nums
数组。