javascript - jQuery - $.extend deep 丢失对数组的引用

标签 javascript jquery arrays

我在 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/

相关文章:

javascript - 如何提取/哪里具有数组属性的 javascript 列表

jQuery UI 自动完成 : Tell It My 'Label' and 'Value'

javascript - jquery float图表在接近点时突出显示点

javascript - 为 "IF"编写具有多个选项的 Jquery If 语句的更短方法

java - 如何在Java中减去两个列表/数组的值?

java - 循环中数组的使用

javascript - 如何访问 <a> 的 href 属性以根据要求比较 url?

c# - 如何使用操作链接在进入 Controller 操作之前获得确认弹出窗口?

javascript - 10 秒后使用 JavaScript 和表单提交重定向到另一个页面

Javascript 组合数组或字符串