ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript の変数は値で渡されるのでしょうか、それともアドレスで渡されるのでしょうか? _JavaScript スキル

JavaScript の変数は値で渡されるのでしょうか、それともアドレスで渡されるのでしょうか? _JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 18:29:081242ブラウズ

このタイトルは発音が少しわかりにくいですが、データ構造を理解するための鍵となります。タイトルの 4 つの用語に対応する英語用語は、シャロー コピー (シャドウ コピーではなくメモ)、ディープ コピー、値渡し、参照渡し (またはアドレス渡し) です。アドレスによる受け渡しと参照による受け渡しは同じことです。

プログラミング言語の核となるのはデータ構造です。大まかに言うと、データ構造は不変型 (immutable) と可変型 (mutable) に分けられます。なぜこんなに分かれているのでしょうか?これにはメモリ割り当ての問題が関係します。不変型の場合は限られたメモリ領域のみを割り当てる必要がありますが、不変型の場合は理論的にはサイズ制限なしで領域を割り当てる必要があります。したがって、この分類はシステム リソースの合理的な使用に基づいています。実際、ヒープ メモリとスタック メモリは、それぞれ不変型の値と可変型の値を格納するために使用されます。

不変型とは何ですか?つまり、値が変数に割り当てられると、その値はその変数にのみ属し、他の変数に属することはできません。例:

コードをコピー コードは次のとおりです。

window.onload=function( )
{

var stringValue = "light";
var anotherStringValue = stringValue;
stringValue = "変更しました"; // 出力変更されました
alert(anotherStringValue);//かすかに出力します


この時、anotherStringValue に保存されている値も「変更しました」となるのでしょうか?しません。なぜなら、

var anotherStringValue = stringValue;

は、stringValue に保存された文字列内の文字列をそのままコピーし (それに応じて、メモリ内に新しい領域を割り当てます)、anotherStringValue に割り当てられた文字列を置き換えます。言い換えれば、これら 2 つの変数は同じ値を保持しますが、それらの値は同じメモリ内にありません。したがって、変数を変更しても、他の変数には影響しません。つまり、

stringValue = “変更しました”;

は stringValue の値にのみ影響します。ただし、正確に言うと、 stringValue = "I haveChanged"; は stringValue を変更するのではなく、新しい文字列を作成し (それに応じて、メモリ内に新しい領域を割り当てます)、 stringValue にその文字列を参照させます。変数; 元の文字列はどうなるでしょうか?変数が参照していないため、ゴミになります (もちろん、ゴミによって占有されていたメモリは再利用されます)。

不変型の場合、代入操作により値自体がメモリに転送されることがわかります。では、可変型についてはどうなのでしょうか?もちろん、渡されるのはメモリ内の値の参照 (またはアドレス) であり、何度渡されても、メモリ内には常に元の値のコピーが 1 つだけ存在します。結局のところ、そのサイズは変数の型は予測できないため、元の値のコピーを 1 つだけ保存すると、保存メモリ領域を最大化できます。例:

コードをコピー コードは次のとおりです。
window.onload=function( )
{
var objectValue = {1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}};
var anotherObjectValue = objectValue ;
objectValue[1] = 100;
alert(anotherObjectValue[1]); //出力 100

}

ここでは、anotherObjectValue が取得されます。代入操作による objectValue から 元のオブジェクト ({1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}}) への参照のみが取得されます。 、メモリ内のオブジェクト 住所、または「番地」。したがって、objectValue (objectValue[1] = 100;) を介して元のオブジェクトの最初の要素を変更すると、anotherObjectValue[1] にも反映されます。これは、これら 2 つの変数が同じ元の値を共有するためです。

JavaScript では、関数にパラメーターを渡す場合は、上記のデフォルトの規則に従います。つまり、不変型の場合は値で渡し、変数型の場合はアドレスで渡します。例:

function example(str, obj){
....
}
example(stringValue,objectValue);

サンプルを呼び出す場合関数の最初のパラメータには実際の文字列値が渡され、2 番目のパラメータにはオブジェクトへの参照 (メモリ アドレス) が渡されます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。