jQuery - $.扩展深度失去对数组的引用



我观察到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数组。

最新更新