2016-10-29 8 views
1

JSプラグインで問題を修正しようとしていますが、デバッグ後に変数が変更されることがあります。だから私はこのコードを置いた:オブジェクトへの参照が2つありますが、1つで修正すると2番目の変数は変わらないオブジェクト

var a = $('#w3').data('fileinput').initialPreviewConfig[index]; 
var b = previewCache.data[id].config[index]; 
if (a === Object(a) && b === Object(b)) { //check a and b are objects 
    if(a == b && a === b) { //check they reference same object 
     a = null; //set a to null, so b should be null as well 
     if(a === null && b !== null) { 
     console.log("This should not be printed!"); //but it is not! 
     } 
    } 
} 

と出力はThis should not be printedです。

両方の変数が同じオブジェクトを指している場合、1つの変数を変更しても別の変数が変更されないのはなぜですか?何が原因でこのようなイベントが発生する可能性がありますか?

編集: 私はコードを単純化しようとしていたが、このaとb時には出力This should not be printedせず、時々ではありません。

if ($('#w3').data('fileinput').initialPreviewConfig[index] === Object($('#w3').data('fileinput').initialPreviewConfig[index]) && previewCache.data[id].config[index] === Object(previewCache.data[id].config[index])) { 
    if($('#w3').data('fileinput').initialPreviewConfig[index] == previewCache.data[id].config[index] && $('#w3').data('fileinput').initialPreviewConfig[index] === previewCache.data[id].config[index]) { 
     $('#w3').data('fileinput').initialPreviewConfig[index] = null; 
     if($('#w3').data('fileinput').initialPreviewConfig[index] === null && previewCache.data[id].config[index] !== null) { 
      console.log("This should not be printed!"); 
     } 
    } 
} 
+1

nullに設定すると、変更されないままBだけなので、これは変数がどのように動作するかで、nullにポイントを作る、メモリAが指した変更されません。 –

+0

コードを簡略化しようとしているのですか、それとも*修正する*しようとしていますか? – Bergi

+0

@Bergiプラグインを修正するためにデバッグコードを単純化しようとしていましたが、時には2つの変数が同時に変更されることもありますが、時には1つに変更されることもあります。 –

答えて

3

この

a = null 

を行うとnullしかしaに何かを設定しません。

bは変更されません。

JSの変数は、メモリのどこかに格納されている値の名前付きポインタと考えることができます。例えば

、以下のコード:

var obj = { name: 'bob' }; 
var a = obj; 
var b = obj; 

は、2つの変数、ab、メモリ内objへのポイントの両方を生成します。あなたは

a = null 

を行う際bはまだobjを指している間、今、あなただけnullaポイントを作っている

a and b pointing to an object

a pointing to null and b pointing to object

+0

ありがとう、その動作を説明しますが、更新された質問を見ることができますか? –

+0

私はメモリ内のオブジェクトをnullにしたいのに、それでもまだaとbを指摘していたらどうしますか? –

+0

メモリ内のオブジェクトを 'null 'にすることはできません。そのオブジェクトへのポインタを' null'にします。ガベージコレクタは実際にオブジェクトを削除します。何かを 'null'にするとは、' null'を表すメモリ内の特別な場所を指すことだけです。 – nem035

関連する問題