我在 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);
我在log这两个的时候,结果如下:
settings: {"numbers":[1,2,3]}
nums: {"numbers":[1,2,3,4]}
我没能理解的是,jQuery 从左到右合并对象。
我希望因为 settings 是最后一个扩展的对象,所以在 nums
中创建的数字数组是对 settings.numbers
的引用(因为 settings
是最后一个被 $.extend
编辑的对象)。事实并非如此(正如您在我记录最终结果时看到的那样)。
谁能解释一下为什么?这是导致我的应用程序中很难找到错误的原因,因此我想确保我理解它,以免再次发生。
最佳答案
您进行了深度合并:
On a deep extend, Object and Array are extended
目标对象是 deep
bool 值之后的第一个对象。
在您的情况下,它是 {}
也是 nums
因为您的分配。
settings
不是目标对象。因此,它的 numbers
数组不是 nums
中的一个。
关于javascript - jQuery - $.extend deep 丢失对数组的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30644665/