2010-04-23 34 views
3

至於我可以在這樣的情況下看到:推對象的引用數組

var x = []; 
var y = {}; 

y.someProp='asd'; 

這並不工作:

x.push(y); 

我想要做的就是添加的參考y到x,以便稍後如果我將「刪除y;」我希望它也可以從數組x中移除。

回答

2

你正在混合變量,引用和對象。

delete y;做移除變量y。由於變量不再存在,它自然不再有價值。因此,所包含變量的引用已消失。

刪除變量但是本身並不是刪除它引用的對象。該數組仍然包含對該對象的引用,並且這兩者都不依賴於該變量的存在。

實際上沒有直接刪除對象的方式。通過銷燬對象的所有引用來移除對象,而不是相反。你想讓對象刪除它的引用,這根本不是它的工作原理。

+0

如果我可以從數組中將對象引用從對象本身的事件中移除,那對我來說就足夠了。 我可以以某種方式傳遞對象引用的引用嗎? – intacto 2010-04-23 09:08:36

+0

@Guffa,'y'只在全局上下文中運行,'y'是'this.y'時才起作用。閱讀:http://perfectionkills.com/understanding-delete/ – James 2010-04-23 10:04:44

+0

@intacto:爲了使對象能夠從數組中移除引用,對象必須包含對包含對其引用的所有數組的引用。因此,在將對象添加到數組中時,還必須將該數組添加到對象中... – Guffa 2010-04-23 10:04:50

0

這不是如何delete作品。它將刪除傳遞給它的對象引用 - 而不是對同一對象的任何其他引用。你正在尋找像「弱引用」這樣的東西,我不知道有什麼方法在JavaScript中實現它們。

0

請問這幫助?

Var x=[{}]; var y=x[0];

編輯: 對不起,我有點簡單,我在回答第一個嘗試。我開始問的是:爲什麼y需要首先在陣列之外「存在」?難道你不能只是創建一個對象數組,並使用delete或array.splice()在需要時刪除對象嗎?其次,如果y需要存在於數組之外,則需要做的是創建一個引用數組索引的屬性,或者可以掃描數組以查找正確的對象引用的實用程序函數去除。換句話說,像

var x=[]; var y={}; y.arrayIndex=(x.push(y)-1); 

// later on, you want to get rid of y 

delete x[y.arrayIndex]; delete y; 
+0

y是通過引用傳遞給函數,所以我不能使用這樣的對象。 – intacto 2010-04-23 08:38:59

+0

你很快就回復了:),同時我試着改進我的建議。 – hallvors 2010-04-23 08:43:57

+0

(即使你將對象傳遞給函數,它也可以很好地工作func(x [0]); - 否?) – hallvors 2010-04-23 08:44:38

0

這並不工作:

x.push(y);

當然有,它將準確地工作打算 - 推y的值,以創建數組。

delete運營商是專門針對上刪除的對象的屬性,如果操作如下表達不能解決的屬性,則什麼也不會發生的。

var y = {"someprop":true}; 

delete y; 
alert(y.someprop); // alerts "true" 

嘗試在你的瀏覽器窗口,以下內容粘貼到地址欄,然後回車:

javascript:var y = {"someprop":true}; delete y; alert(y.someprop); 
+0

我知道了,謝謝。有沒有一種方法可以得到新推入的元素的索引? – intacto 2010-04-23 09:15:27

+0

@intacto:'push()'將元素追加到數組的末尾,返回值是新的長度,所以如果只添加一個元素,那麼索引總是'array.push(item)-1',例如。 'var index = x.push(y) - 1;' – 2010-04-23 09:28:01