2011-12-05 116 views
0

我有一個循環經過對象MyArrayOfObjects的數組,然後推壓的對象到一個新的數組這樣的:推JavaScript對象到陣列

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); 
} 

正如我通過My​​ArrayOfObjects環,我清除TempObject和創建每次都有新的。 NewArray是否包含我正在複製的對象或只是對被複制對象的引用,然後在循環迭代時會被刪除?

謝謝。

+0

'TempObject = null;'如果你有'TempObject = new Object();'之後? – mc10

+0

我想確保在創建新對象之前清除最初的對象。 null是不需要的? – frenchie

+0

@frenchie正確,不需要。此外,你應該簡單地寫'var TempObject = {};'甚至'var TempObject = {prop1:MyArrayOfObject [i] .prop1,prop2:MyArrayOfObjects [i] .prop2};''甚至'NewArray.push({prop1 :MyArrayOfObjects [i] .prop1,prop2:MyArrayOfObjects [i] .prop2});';所有這三個將導致10個新對象被推入陣列。 – Phrogz

回答

2
> var NewArray = 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); 

此時,TempObjectNewArray [NewArray.length - 1]均引用同一個對象。

> } 

當我通過My​​ArrayOfObjects循環,我清除TempObject每次創建 一個新的。

沒有必要「清除」對象,只需給變量賦一個新的值即可。在JavaScript中,所有的變量有可能是原語(如字符串,數字)的值或一個對象的引用(例如對象,數組,數字,字符串)

不NewArray包含了我的對象 複製或只是對被複制對象的引用,然後變成 隨着循環迭代被刪除?

它包含對在每次迭代中創建的新對象的引用。

由於變量持有對對象的引用,因此將新值賦給變量對對象不起任何作用。當一個對象不再被任何變量或對象屬性引用時,它就可以用於垃圾收集,並且可以在稍後垃圾收集運行時自動刪除。

+0

好的,當我做var TempObject = {}時,發生了什麼?每次循環迭代?它是否仍然存在,但變得無法訪問並造成某種內存泄漏? – frenchie

3

它包含對對象本身的引用。

此代碼顯示了概念在動作(注意將其推入該陣列之後,改變該對象陣列中改變所述對象爲好):

var ray = new Array(); 
var obj = { foo: 123 }; 

ray.push(obj); 

obj.foo = 321; 
alert(ray[0].foo); 
+0

我有這個循環:如果我的循環運行10次,我會有10個不同的對象在數組中或10次相同的對象或別的東西? – frenchie

+1

請注意,當您執行'var obj = {foo:123}'時,'obj'也只是一個參考。如果你接着說'obj = {foo:456}',原始對象不變。由於它仍然會在循環中被引用,所以**循環將允許有許多不同的對象,而不是同一對象的許多副本。** –

+0

@frenchie我使用'new Object'或'{}'10次,你將有10個不同的對象。 – Phrogz

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) 
+0

我不能使用它,因爲我只根據循環內的某些邏輯複製對象屬性的一部分。 – frenchie