2016-09-19 3 views
0

は私のユースケースである:参照する変数をnullに設定するにはどうすればよいですか?ここ

Phaser.ioにユーザーがボタンを押したときに、私は地元のlet newSquare変数にPhaser.spriteを設定し、私はPhaser.spriteのSquares配列にそれを.push()

後で、私はそのnewSquare変数にdestroy関数を呼び出して、それをnullに設定します。スプライトはよく.destroy()後に画面から削除されている間、私はまだ私のSquares配列からそれにアクセスすることができます...

私はnullにnewSquare変数を設定している場合、オブジェクトであることは、それが設定されるだろう、と思いました他のすべての参照についてもnullにする必要はありますか?

なぜSquaresの配列のリファレンスがnullに設定されていないのですか?

抜粋:

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

実際にはありません。あなたは同じ "もの"への複数の参照を持つことができます。これらの参照の1つをnullに設定しても、他の参照は無効になりません。しかし、 '.destroy()'を呼び出すと無効になります。オブジェクトを明示的に破棄しました。つまり、他の参照を使用しているものは、破棄されたオブジェクトに「ポインタ」を使用しようとしています。それはあなたの家の周りに3つのメモを "ベッドの下に引出しの靴下"と言うようなものです。あなたがポストのいずれかを焼くなら、あなたは引き出しに靴下を持っています。あなたが引き出しを燃やすと、それらの紙幣はまだそこに靴下があると言います。 –

+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編に、配列内のオブジェクトのインデックスを見つけるために、その参照を使用すると思います。 referenceは以前nullに割り当てられた識別子であり、例えば、

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

...。

要素を無効にして配列内の現在の位置を維持する方法は、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'でアンセットすることができますか?オブジェクトにアクセスしてそのメソッドを呼び出すことができれば、「newSquareが指し示す場所に0ビットを入れて」と言うことができるはずです。 –

関連する問題