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是一个数组,因此它需要深度克隆,因此isvarb=jQuery.extend({},a)
essential Synomical tovar b=a
?在这种情况下,如果属性不是数组或对象,则浅层副本可以工作@exizt否它取决于保留的属性值。我在我的答案中添加了更多的代码