我发现了一个在尝试使用循环时没想到的行为,以便更改对象中属性的值集。
基本上,我在循环外声明我的对象。 然后我循环一个数值数组,这些值用于更新对象属性。 在循环内部,我将当前对象状态存储在外部数组中。
结果是,不是让一个数组包含一系列具有不同数值的对象,我最终在每个存储的对象中都有相同的数值。
这是小提琴 http://jsfiddle.net/fAypL/1/
jQuery(function(){
var object_container = [];
var numeric_values = [1, 2 , 3, 4];
var my_object = {};
jQuery.each(numeric_values, function(index, value){
my_object['value'] = value;
object_container.push(my_object);
});
jQuery.each(object_container, function(index, value){
jQuery('#content').prepend(value['value']);
});
});
我希望得到1 2 3 4作为存储在每个对象中的值,但是,我得到的是4 4 4 4,这对我来说没有意义。
非常欢迎任何有关此行为的提示,谢谢
答案 0 :(得分:5)
当您的代码调用.push()
并传递my_object
时,传递的内容是对象的引用。没有副本。
因此,您已将对完全相同的对象的四个引用推送到数组中。
JavaScript对象始终以引用的形式参与表达式。没有其他方法可以处理对象。因此,当您创建变量并将其值设置为对象时,您实际上将其值设置为对象的引用。与参数传递相同,以及对象可以在表达式中出现的任何其他位置。
在这种情况下,您可以非常轻松地创建新对象;只需省略my_object
并在每次迭代时推送一个新的:
object_container.push( { value: value } );
答案 1 :(得分:2)
每次循环时都不会创建新对象 - 您只是更新相同的现有对象并将其引用推送到对象数组。要创建一个新对象,您需要执行以下操作:
my_object = { 'value': value };
object_container.push(my_object);
在这种情况下,您现在将获得更像您所寻找的东西。请在此处查看更新的小提琴:http://jsfiddle.net/fAypL/2/。
祝你好运!
还有一个想法(克隆!) - 如果你真的想要每次使用同一个对象,只需在添加到数组之前克隆对象。 that here有一个很好的解决方案。
答案 2 :(得分:0)
你正在使用jQuery,所以如果你想要的是合并而不影响原始的外观:
var both_obj = $.extend( {}, default_obj , adding_obj );
这会使您的原始对象发生变化,也可以用于copy
。
答案 3 :(得分:0)
备用版本是使用带有构造函数的对象和new
关键字:
var object_container = [];
var numeric_values = [1, 2 , 3, 4];
function MyObject(value)
{
this.value = value;
}
jQuery.each(numeric_values, function(index, value){
object_container.push(new MyObject(value));
});
jQuery.each(object_container, function(index, value){
jQuery('#content').prepend(value['value']);
});