今日、私は割り当ての問題を伴うJavaScriptについての質問に答えたので、この問題を注意深く要約したいと思います。
コードコピーは次のとおりです。
var a = 'test';
var b = function(){};
ba = 'test';
関数変化(M、N){
m = 'change';
Na = 'Change';
}
変更(a、b);
上記のコードを実行した後、変数AとBの値は変化しますか?
元の値と参照値
以前の記事に元の値と参照値を導入しました。元の値とは、スタックに保存されている未定義、null、boolean、number、stringなどを指し、参照値はヒープに保存されているオブジェクトから統合されます。
ここでは、2つを区別する必要があります。
コードコピーは次のとおりです。
var a = 'test';
var b = new String( 'test');
var a = 'true';
var b = new boolean( 'true');
上記の4つの変数の場合、AとAは元の値であり、BとBは基準値です。
割り当てメカニズム
元の値と参照値の違いを明確にした後、JavaScriptの割り当てメカニズムを詳細に導入できます。
JavaScriptでは、各割り当ては元の値タイプの変数のコピーを生成し、その名前として参照される値に対して、同じストレージオブジェクトのメモリを参照して割り当てられます。
元の価値の割り当て:
コードコピーは次のとおりです。
var a = 1; //元の値
var b = a; //変数bにコピーを生成する
b = 2; // aとは関係ありません
アラート(a); //出力1
参照値の割り当て:
コードコピーは次のとおりです。
var a = new object(); //参照値
ax = 1;
var b = a; //参照割り当て、同じメモリを指す
bx = 2; // bの変更はaに影響します
アラート(ax); //出力2
パラメーターパス
次に、2種類の値を渡すことでパラメーターを同時に処理する方法を見てみましょう。
1。元の値を渡します
コードコピーは次のとおりです。
var a = 1;
関数テスト(M){
m = 2;
}
テスト(a);
アラート(a); //出力1
出力は1であるため、関数が変数の値を渡すだけであるため、関数本文のmは値1を取得し、2に割り当てられます。このプロセスは外部変数aに影響しません。
2。参照値を渡します
コードコピーは次のとおりです。
var a = new object();
ax = 1
関数テスト(M){
MX = 2;
}
テスト(a);
アラート(ax); //出力2
出力は2であるため、関数が変数のアドレスを渡すことがわかっているため、関数本文のmは渡されたアドレスを取得します。したがって、属性xが2に割り当てられている場合、同じメモリアドレスを指すことにも影響します。
要約します
それでは、冒頭の質問に戻りましょう。
コードコピーは次のとおりです。
var a = 'test';
var b = function(){};
ba = 'test';
関数変化(M、N){
m = 'change';
Na = 'Change';
}
変更(a、b);
変数Aは元の値、変数Bは基準値、1つは値として関数本体に渡され、もう1つはアドレスであるため、関数の実行後、変数Aは変化せず、変数Bの値は変化します。