私の1つの文の概要:元の値は、それが変数割り当てであるか、関数パスであるかに関係なく、元の値を変更しません。変数割り当てであろうと関数パスであろうと、新しい変数が再割り当てされている場合、元の参照値には影響しません。新しい変数が直接操作である場合、元の参照値に影響します。
まず、値とタイプが2つの異なる概念であることは明らかです。たとえば、nullはnullタイプの一意の値であり、未定義は未定義タイプの一意の値であり、真とfalseはブール型の唯一の値などです。
値:つまり、値を新しい変数に割り当てるか、変数を介して別の変数、属性、または配列要素に値を割り当てます。
値を渡す:つまり、値をパラメーターとして関数またはメソッドに渡す。
値を比較する:つまり、値を別の値と比較して、それが等しいかどうかを確認します。
値タイプデータと参照データの値には異なる形式があるため、自然に動作する方法と生成された結果も異なります。値がValueタイプのデータである場合、それを元の値または基本値と呼ぶことが多いことに注意してください。値が参照されている場合、多くの場合、参照値または複合値と呼びます。
1.元の値を使用します
元の値については、その操作の3つのレベルを次のように説明します。
1)値をコピーします
割り当てステートメントでは、操作プロセスが実際の値のコピーを作成します。コピーの値と実際の値の間には接続はありません。それらは、さまざまなスタックエリアまたはヒープエリアだけにあります。このコピーは、変数、オブジェクトのプロパティ、および配列要素を保存できます。例えば:
var n = 123、a、b = []、c = {}; a = n; //番号123 b [0] = nをコピーします。 //番号123 cx = nをコピーします。 //番号123(a == b [0])&&(a == cx)&&(b [0] == cx)&& alert( "コピーされた値は等しい"); //それらの値が等しいことを検出します上記の例では、値123は、それぞれ変数A、アレイB、およびオブジェクトCに3コピーをコピーします。彼らの価値は平等ですが、彼らは互いに独立しています。
2)値を渡します
値を関数またはメソッドに渡す場合、渡された値はコピーだけでなく、値そのものではありません。たとえば、関数の合格値を変更すると、結果はこのパラメーター値のコピーにのみ影響し、元の値に影響しません。
var a = 123; //元の値関数f(x){x = x + x; } f(a); //関数を呼び出して、渡された値アラート(a)を変更します。 //変数Aの値が影響を受けるかどうかを確認します。返品値は123であり、変更がないことを示しています3)比較値
上記の例では、元の値を比較すると、バイトバイトの比較が実行され、それらが等しいかどうかを判断することもわかります。値がある場所ではなく、値自体を比較します。比較の結果は等しいかもしれませんが、それが含むバイト情報が同じであることを意味します。
2。参照値を使用します
参照値については、操作の3つのレベルを次のように説明します。
1)値をコピーします
割り当てステートメントでは、割り当てられた値は、元の値のコピーではなく、元の値への参照でも、元の値自体でもありません。つまり、割り当てが実行された後、変数は元の値(つまり、元の値のストレージアドレス)への参照を保存します。複数の変数、配列要素、またはオブジェクトプロパティの間にコピーされると、それらはすべて、元の変数によって保存された参照と同じになります。
すべての参照には同じ効果と機能があり、実行できます。データが参照のいずれかを介して編集されている場合、この変更は元の値やその他の関連する参照に反映されます。例えば:
var a = [1,2,3]; //配列参照b = aを割り当てます。 //値b [0] = 4; //変数Bアラート(a [0])の最初の要素の値を変更します。 //返品4、変数Aの最初の要素の値も4に変更されていることを示します
ただし、新しい値が変数Bに再割り当てされている場合、新しい値は元の値のコンテンツに影響しません。例えば:
var a = [1,2,3]; //配列参照b = aを割り当てます。 //値b = 4をコピーします。 //割り当てアラート(a [0])を上書きします。 //変数aのコンテンツは変更されていません
繰り返しの割り当ては、実際には元の値に対する変数の参照を無効にし、別の値のコピーまたはそれへの参照になります。したがって、それは元の値に影響を与えません、そして、実証図を図4-2に示します。
2)値を渡します
参照がデータを関数に渡すために使用される場合、関数に渡されたものは元の値への参照でもあります。この関数は、この参照を使用して元の値自体を変更でき、機能の外側に変更が表示されます。例えば:
var a = [1,2,3];関数f(x){x [0] = 4; //関数のパラメーター値を変更} f(a); //参照値アラート(a [0]); // 4を返し、元の値が変更されます関数内で変更されるのは、オブジェクトまたは配列自体の値ではなく、外部オブジェクトまたは配列への参照であることに注意してください。参照を使用して、関数内のオブジェクトの属性または配列の要素を変更できますが、関数内で新しい参照を使用して元の参照を上書きする場合、関数内の変更は元の参照の値に影響を及ぼさず、関数の外側には表示されません。
var a = [1,2,3];関数f(x){x = 4; //関数のパラメーター値を変更} f(a); //参照値アラート(a [0]); //戻る1、元の値は変更されません3)比較値
2つの参照値を比較する場合、2つの参照アドレスを比較して、元の値が等しいバイトであるかどうかではなく、元の値が同じコピーであるかどうかを確認します。 2つの異なる値を参照する場合、それらは同じバイト構成を持っていますが、2つの参照の値は等しくありません。
var a = new Number(1); //参照値var b = new番号(1); //参照値b var c = a; // c alert(a == b)への参照を割り当てます。 // false alert(a == c)を返します。 // trueを返します
したがって、{} == {}、[] == []、すべてがfalseを返します。参照アドレスが異なるためです。
要するに、任意の言語の場合、値を使用し、参照を使用することは、データ操作の2つの基本的な方法です。データを操作するとき、それを処理するために使用する方法は、主にデータのタイプに依存します。操作に参加する値タイプと参照データは異なります。値タイプデータは値を使用してデータで動作し、参照データは参照を使用してデータで動作します。異なる計算方法も、自然に異なる結果を生み出します。別の例を見てみましょう:
var s = "abc"; //文字列、値タイプデータvar o = new String(s); // string object、boxed string function f(v){//操作function v.tostring = function(){// method toString toString()Return 123; }; } f(s); //値アラートを渡します。 //文字列「ABC」を返し、操作が元のデータf(o)に影響を与えていないことを示します。 //参照アラート(o)を渡します。 //値123を返し、操作が元のデータの内部構造に影響を与えたことを示します値タイプは実際の値で操作に参加するため、元のデータと直接接続されていません。参照タイプは、参照アドレスを使用して操作に参加し、計算結果は参照アドレスに関連付けられたヒープエリアデータブロックに影響します。ただし、1つの例外があります。 JavaScript文字列の場合、その動作方法は比較的複雑です。詳細については、グーグルでお願いします!
上記の記事JavaScriptデータ操作_A元の値と参照値の操作の本質に関する簡単な議論は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。