我有一个循环遍历MyArrayOfObjects对象数组,然后将对象推送到这样的新数组:
var NewArray = new Array();
for (i = 0; i < MyArrayOfObjects.length; i++) {
TempObject = null;
TempObject = new Object();
// I have logic that copies certain properties but not others
// but overall it looks like this:
TempObject.prop1 = MyArrayOfObjects[i].prop1;
TempObject.prop2 = MyArrayOfObjects[i].prop2;
NewArray.push(TempObject);
}
当我遍历MyArrayOfObjects时,我清除TempObject并每次创建一个新的。 NewArray是否包含我正在复制的对象,或者只是对复制的对象的引用,然后在循环迭代时被删除?
感谢。
答案 0 :(得分:3)
它包含对象本身的引用。
此代码显示了操作中的概念(注意在将其推入数组后更改对象也会更改数组中的对象):
var ray = new Array();
var obj = { foo: 123 };
ray.push(obj);
obj.foo = 321;
alert(ray[0].foo);
答案 1 :(得分:2)
> var NewArray = new Array();
通常认为使用数组文字来创建数组会更好。以大写字母开头的变量名称是常规,用于构造函数。在变量名称的开头使用“new”可以很容易地变成“new Array”,并且名称应该反映其目的,所以类似下面的内容可能会更好:
var objectArray = [];
> for (i = 0; i < MyArrayOfObjects.length; i++) {
您应该始终声明变量,尤其是计数器,因为未声明的变量在首次分配值时会成为全局对象(实际上是全局变量)的属性。此外,存储数组的长度比在每次迭代中获取它更好:
for (var i = 0, iLen = MyArrayOfObjects.length; i < iLen; i++) {
> TempObject = null;
> TempObject = new Object();
再次声明变量。如果您要在之后立即分配其他值,则分配 null 的值没有任何用处。只做第二个任务(并使用文字):
var TempObject = {};
> // I have logic that copies certain properties but not others
> // but overall it looks like this:
>
> TempObject.prop1 = MyArrayOfObjects[i].prop1;
> TempObject.prop2 = MyArrayOfObjects[i].prop2;
>
> NewArray.push(TempObject);
此时, TempObject 和 NewArray [NewArray.length - 1] 都引用同一个对象。
> }
当我遍历MyArrayOfObjects时,我清除TempObject并创建 每次一个新的。
无需“清除”对象,只需为变量赋值即可。在javascript中,所有变量都有一个可能是基元的值(例如字符串,数字)或对象的引用(例如,对象,数组,数字,字符串)
NewArray是否包含我所拥有的对象 复制或只是对复制的对象的引用然后变为 在循环迭代时删除?
它包含对每次迭代时创建的新对象的引用。
由于变量保存对象的引用,因此为变量赋值不会对对象执行任何操作。当一个对象不再被任何变量或对象属性引用时,它可用于垃圾收集,并且可以在以后运行垃圾收集时自动删除。
答案 2 :(得分:0)
使用map或其jquery counterpart可能是一种更为惯用的方式。例如:
var oldArray = [
{ prop1: 1, prop2: 10 },
{ prop1: 2, prop2: 20 },
{ prop1: 3, prop2: 30 }
]
var newArray = $.map(oldArray, function(oldObj) {
return { newProp: oldObj.prop1 }
})
console.log(newArray)