Javascript 为什么这个递归jQuery.extend调用不起作用?

Javascript 为什么这个递归jQuery.extend调用不起作用?,javascript,jquery,Javascript,Jquery,我使用jquery.extend编写了以下javascript代码: hash1 = {"/":{"programme-nav":true}}; hash2 = {"/":{"what-is-scheme":true}}; merged = $.extend(hash1, hash2); deep_merged = $.extend(true, hash1, hash2); //expected_deep_merged = {"/":{"programme-nav":true, "what-i

我使用jquery.extend编写了以下javascript代码:

hash1 = {"/":{"programme-nav":true}};
hash2 = {"/":{"what-is-scheme":true}};
merged = $.extend(hash1, hash2);
deep_merged =  $.extend(true, hash1, hash2);
//expected_deep_merged = {"/":{"programme-nav":true, "what-is-scheme":true}};
console.log("merged = "+JSON.stringify(merged));
// gives {"/":{"what-is-scheme":true}};
console.log("deep_merged = "+JSON.stringify(deep_merged));
// also gives {"/":{"what-is-scheme":true}};
根据API,传递true作为第一个参数将递归地合并对象。在这种情况下,我希望在评论中得到结果。但是,我得到的和我做非深延伸时一样

我在这里为此设置了一个JSFIDLE,它将输出到控制台,这样您就可以开始玩了

谁能解释一下我哪里出错了?谢谢,麦克斯

编辑:我是个白痴。作为第一个参数传递true确实可以正确地进行深度合并,但我没有注意到的是,在示例的第一部分中,我已经覆盖了hash1,在这里我进行了非深度合并,所以当我开始进行深度合并时,我实际上是这样做的:

deep_merged =  $.extend(true, {"/":{"what-is-scheme":true}}, {"/":{"what-is-scheme":true}});

大量doh。谢谢所有读过这篇文章的人。我将尽可能多地奖励分数,然后删除此问题。

Extend不会复制数据结构,它会修改作为第一个参数传递的数据结构,该参数由方法返回

Tour对entend的第一个调用修改了“hash1”,最终与“hash2”相同

在第二次调用中,您正在合并两个相同的哈希

要实现您的目标,请在扩展参数中传递一个新实例

result = $.extend(true, {}, hash1, hash2);

此调用不会修改“hash1”

Extend不会复制数据结构,它会修改作为第一个参数传递的数据结构,该参数由方法返回

Tour对entend的第一个调用修改了“hash1”,最终与“hash2”相同

在第二次调用中,您正在合并两个相同的哈希

要实现您的目标,请在扩展参数中传递一个新实例

result = $.extend(true, {}, hash1, hash2);

此调用不会修改“hash1”

传递额外的空对象实际上不是必需的,请参阅我的编辑。这不是必需的,但通常很方便:@MaxWilliams您仍然需要空对象,否则hash1将被更改。请看:通过将返回值赋给一个新变量来暗示情况并非如此,这以后肯定会带来麻烦。啊,我明白了-在这种情况下,我不介意是否更改原始值,但我认为您是对的,最好避免更改原始值。传递额外的空对象实际上没有必要,查看我的编辑。这不是必需的,但通常很方便:@MaxWilliams您仍然需要空对象,否则hash1将被更改。请参阅:通过将返回值指定给新变量来暗示情况并非如此,这肯定会成为以后的麻烦来源。啊,我明白了-在这种情况下,我不介意更改原始变量,但我认为您是对的,最好避免更改原始变量。我给您+1进行编辑:我给您+1进行编辑: