2016-09-19 80 views
0

這裏是我的使用情況:如何將引用變量設置爲null?

上Phaser.io,當用戶打一個按鈕,我設置了Phaser.sprite到本地let newSquare變量,我把它.push()Squares陣列Phaser.sprite的。

後來我打電話給那個newSquare變量的一些destroy函數,然後我把它設置爲null。雖然精靈從屏幕的.destroy()好後取出,我仍然可以從我的Squares數組訪問...

我認爲,作爲如果我設置newSquare變量設置爲null一個對象,它會被設置對於所有其他引用也爲null,不應該嗎?

那麼,爲什麼我的Squares數組中的ref未設置爲空?

摘錄:

eventFunction (e, i) { 
     let newSquare = Game.add.sprite(Lines.attack.a, 0, 'square'); 

     // Some other methods call here 
     Squares[ e.target.dataset.line ].push(newSquare); 

     setTimeout(() => { 
     if (newSquare) { 
      newSquare.destroy(); 
      newSquare = null; 
      console.log(Squares); // will print an array with an iteration corresponding to newSquare object, when I want it to be set to null, in order to clean the array with a _.pull() 
     } 
     }, (2 * 1000)); 

} 

缺少什麼我在這裏?謝謝。

+2

不是真的。你可以有多個對同一個「事物」的引用。將其中一個引用設置爲null不會使其他引用無效。但是調用'.destroy()'會使它們失效。你明確地銷燬了這個對象,這意味着其他任何使用這些其他引用的東西現在都會嘗試使用它們的「指針」來銷燬一個對象。這就好像在你的房子周圍放了三張紙條,上面寫着「抽屜裏的襪子在牀下」。如果你燒了其中的一個帖子,你的抽屜裏仍然會有襪子。但如果你焚燒抽屜,這些筆記仍然會說那裏有襪子。 –

+0

@MarcB我不知道在Phaser中究竟有'.destroy'的功能,但我想象一個更好的比喻是關閉並鎖定襪子抽屜。所以它仍然存在,所有的跡象仍然指向它,它可能仍然有襪子,但你不能到達它們。 – vlaz

回答

2

您只是取消了對最初創建的對象的引用。該對象仍然存在於內存中,並通過數組訪問來引用它。這意味着它不會被垃圾收集。您需要將其排除在陣列內...

以下是您問題的簡化版本。

let x = {a: 1, b: 2, c: 3}; 
let y = x; 

x = null; 
console.log(y); 
// => {a: 1, b: 2, c: 3} 

我想說保持參照項目在內存中,並使用該參考陣列內找到對象的索引,你push版來。例如,

array.find(el => el === reference) 

...其中reference是您以前分配給null標識符。

一種使元素無效並保持其在陣列中的當前位置的方法是使用reference來映射您的集合以找到您的項目。例如,

array = array.map(el => el === reference ? null : el) 

如果你正在尋找一種變化的方法來修改就地元素,使用forEach(..)。例如,

array.forEach((x, i, arr) => { 
    if (x === reference) { 
    arr[i] = null; 
    } 
    return; 
}); 

forEach通話將訪問每個元素的數組中,所以如果你想短路迭代,嘗試使用indexOf循環。

const i = array.indexOf(reference); 
array[i] = null; 
+1

'array.map(...)'不會就地修改數組。 – vlaz

+0

是的,你是對的。我想我過於寬鬆地使用了「就地」。我的意思是在陣列中的當前位置。我將它改變爲一個變化的'forEach(..)' – wpcarro

+0

因此,我的'newSquare'變量指的是我的對象開始的內存區域,好吧。但是我怎麼能通過'newSquare'來取消這個內存地址的內容?如果我可以訪問這個對象並調用它的方法,我應該可以有一種方法來說「把一串0位放在我的newSquare指向的地方」,不是嗎? –