Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery:object[property]。如果使用jQuery.extend()创建新对象,push()将修改旧对象_Javascript_Jquery_Clone - Fatal编程技术网

Javascript jQuery:object[property]。如果使用jQuery.extend()创建新对象,push()将修改旧对象

Javascript jQuery:object[property]。如果使用jQuery.extend()创建新对象,push()将修改旧对象,javascript,jquery,clone,Javascript,Jquery,Clone,考虑以下示例代码: a={}; a['herp']=['derp']; var b = jQuery.extend({}, a); b['herp'].push('foo'); alert(a['herp']); //this produces message box with "derp,foo" 我的理解是varb=jQuery.extend({},a)克隆一个对象(如John Resig),即创建一个与上一个对象具有相同属性的新对象。如果这是正确的,那么为什么b['herp'].pus

考虑以下示例代码:

a={};
a['herp']=['derp'];

var b = jQuery.extend({}, a);
b['herp'].push('foo');
alert(a['herp']); //this produces message box with "derp,foo"
我的理解是
varb=jQuery.extend({},a)克隆一个对象(如John Resig),即创建一个与上一个对象具有相同属性的新对象。如果这是正确的,那么为什么
b['herp'].push('foo')修改
a
,如
警报(a['herp'])所示

jsidle示例:

我认为您应该:

var b = jQuery.extend(true, {}, a);
在这里拉小提琴

这是因为该属性是一个数组,您需要一个深度克隆。正如文件中所述:

默认情况下,$.extend()执行的合并不是递归的;如果 第一个对象的属性本身就是一个对象或数组,它将 被第二个中具有相同键的属性完全覆盖 对象。值不会合并。但是,通过为 第一个函数参数,对象将递归合并

如果不进行深度复制,
b['herp']
只包含对
a['herp']

如果属性不是如本例中所示的数组或对象,则情况会有所不同:

a={};
a['herp']='derp';

var b = jQuery.extend({}, a);
b['herp'] = 'foo';
alert(a['herp']);//alerts derp

alert(b['herp']);//alerts foo

在这里拉小提琴

你应该仔细阅读并使用谷歌。通常-创建一个新的“副本”。但是指向同一块内存(数据变量、常量等)。从而表示原始对象的“同义词”。现在最重要的是——无论你改变哪一个,它都会影响这两个方面


由于原始对象的所有数据都复制到新对象中,因此更耗时。这两个对象具有相同的结构(而不是指向相同的结构)。但是更改只会影响其中一个对象。

我刚刚尝试了这个,是的,它成功了。这似乎创造了一个“深度”拷贝。但这意味着什么?浅拷贝和深拷贝有什么区别?关于这件事,我在谷歌上找不到任何东西。@exizt我更新了我的答案。事实上,porperty是一个数组,因此它需要深度克隆,因此is
varb=jQuery.extend({},a)
essential Synomical to
var b=a
?在这种情况下,如果属性不是数组或对象,则浅层副本可以工作@exizt否它取决于保留的属性值。我在我的答案中添加了更多的代码