JavaScriptの変数、ポインタや参照で話します
1、変数
それが何を意味し、最終的に言語変数をプログラミング:私たちは疑問を持っていること?
私たちは、変数aを定義するときに実際には、それはメモリのメモリセルのグループを指定することで、メモリセルのセットが指定されています。実際には、変数Aの値が、記憶部に記憶された特定の情報の集合で記述する。
例えば、JSで
あります。= 10;
指定されたメモリ内の最初の文は、メモリセルのグループ、および命名した;
第二の文番号10は、記憶ユニットのセットに格納されます。
10の変数の平均値が実際に格納されるグループ情報記憶部10です。
再び我々コピー操作の場合:
A = "こんにちは";
文字列「こんにちは」にそのような値。それは私達が「こんにちは」、符号10は、元が上書きされます明確に格納されている文字列へのグループ情報記憶部であるだろう、理解しやすいです。
図2に示すように、ポインタ
我々は、別の変数bに何が起こるかの可変アドレスメモリに保存されている場合は?
これは、B変数に直接アクセスする、と考えることは容易である、得られた値は変数ではなく、それはポインタ変数bメモリ内の変数のアドレスと呼ばれています。
疑問が生じる:どのように変数bにより、変数の値にアクセスするには?
C言語では、一般的のような、*が使用します:
INT、C = 10 、B; INT * P; / * pがint型のポインタへのポインタである* / P ; =&C / * 格納されたpが変数cアドレスであるので、変数pに割り当てられ、アドレスの&C取得変数c、及びすなわち、PはCを指し示すポインタである* / B = * P; / * オブジェクトへのアクセス* p個のP点、その値をBに割り当てられています* /
JSでは、これは、ポインタ変数のタイプではなく、ポインタがどこにでも適用されます。例えば:
VAR O1 = {B 1 }。 VAR O2 = {B 1 }。 01 === O2; // 偽 O1 == O2; // 偽
ここO1とO2が同じオブジェクトである、なぜそれが等しくありませんか?これはJavaScriptでの深い理解とポインタ参照型が必要です。
まず、我々は理解する必要があります。
、O2アドレスホールドオブジェクト{B 1}:O1及びO2は、割り当てにアドレスがオブジェクトO1 {1} Bに格納されていません。
第二に、我々は実際に起こった動作を理解する必要があります。
var o1={b:1}
メモリヒープ{B 1}内のオブジェクトの作成を可能{B:1}、O1ターゲットアドレスがヒープメモリ、すなわちO1に格納されるへのポインタである。
同様に、var o2={b:1}
また、ヒープ内すなわち、O2はB {1}へのポインタであり、O2格納ヒープメモリアドレス内のオブジェクト:オブジェクト{1、B}を作成し、
原因二つの同一のオブジェクト{B 1}に、順次ですヒープメモリ上に作成されたが、同じアドレスに格納されていません。
その後、我々はまた、知っておく必要があります。
JavaScriptでは、比較基準タイプ(オブジェクト、配列、正規、日付、機能)は、実際には比較的ポインタは、同じに同じアドレスを指し、メモリのアドレスの同じ期間を指しているされています。
;明らかに、第一の目的は、{1}、B作成ヒープメモリO1へのポインタである
第二の目的{B:1}を作成するために、O2ヒープメモリ・ポインタ・ポイント、
が、2つの独立したオブジェクト、同じではありません従ってO1及びO2の目的は、ヒープの同じメモリアドレスを指していないので、等しくないん。
私たちは、一般的なアプリケーションを見て:
VaRの O = {1 }。 proto__ .__について ===のObject.prototype。// 真
Oは、オブジェクトのConstructorオブジェクトである、オブジェクトの属性がプロトタイプとプロトタイプは、彼の記憶のオブジェクトへのポインタである必要があり、このオブジェクトは、オブジェクトのインスタンスがコンストラクタによって作成された共有されます。
オブジェクトの例として、oはポインタ有する__proto__
オブジェクトのオブジェクトプロトタイププロパティポイントを指し、。
明らかに同じオブジェクトを指して、同じポイントの両方のヒープメモリのアドレスを示し、ここでは真の一致を返します。
我々は2つの参照がオブジェクトの同じタイプを指すようにするためのイニシアチブを取りたい場合は、どのように動作しますか?
た OBJ1 = {B 1 }。 だっ obj2が= OBJ1。 OBJ1 === obj2が。// 真 obj1とobj2が==; // 真
参照型、同じオブジェクトへの両方の点の割り当てそれ「=」事実の直接の使用のために、参照。
したがって、我々はあなたがたときに再び訪れOBJ2、OBJ1によってオブジェクトの値を変更する場合は、変更されたオブジェクトが表示されます、推測します:
obj1.name = 'ls'の。 OBJ1; // {B:1、名称: "LS"} OBJ2。// {B:1、名称: "LS"}
確かに。比較として:
o1.name = 'ls'の。 01; // {B:1、名称: "LS"} O2。// {B 1}
だから、それの基本的なタイプのために?
た S1 = 1 。 た S2 = 2 。 S1 === S2; // 真
JSでは、プリミティブ型単に等しい値について、2つの変数が等しいです。
3、参照
まず第一に、私たちは、詳細な基準値の種類を理解する必要があります。
我々は、前に見たobj1とメモリに保存されている同じオブジェクトヒープを参照してくださいOBJ2。私たちはobj1とobj2のを訪問するとき、それは同じオブジェクトを返します。それは言うことができます:obj1とobj2のと同じ値です。
O1及びO2のために、彼らは、ヒープ2 {B 1}を指すオブジェクトO1の異なるアドレスと異なる値を有するO2。
したがって、参照型のために、我々は、メモリに記憶されたオブジェクトを参照し、値について話しています。それは同じオブジェクト、同じ値であれば、異なる値が異なるオブジェクト。
JSでは、転送パラメータは値によって渡されます。例えば:
VAR A1 = 1、B1 = 2 。 機能追加(B){ ++ 。 B - ; 返す +のBを、 }。 (A1、B1)を追加。// 3つの A1。// 1つの B1。// 2
ここでは、パラメータの関数が値によって渡され、Bそれぞれの変数a1を、コピーのB1値を、追加します。
A、Bの操作のための追加機能の実行環境でのB1をグローバル変数A1には影響を与えません。
参照型を見て:
関数のsetName(OBJ){ obj.name = "ニコラス" 。 OBJ = 新しいオブジェクト(); obj.name =「グレッグ」。 } VARの人= 新しいオブジェクト(); setName(人)。 警告(person.name)。// 「ニコラス」
実行setName(person)
時間は、メモリ内のアドレスの人はOBJ渡され、OBJも、同じオブジェクトで同じメモリアドレスへのポイントになります。ここでは値によって渡され、メモリアドレスが転送されます。
あなたがobjでオブジェクトを変更する場合は、外部アクセスの人にも反映されます。
それが参照することによって渡されていない理由は、同じオブジェクト、を指しているので、私たちは、疑問を持っていること?
まず第一に、私たちは、内部関数は、新しく作成されたオブジェクトへのOBJポイントように再割り当てされてobjを参照してください。それは、参照によって渡された場合は、外部の人も、新しく作成されたオブジェクトを指します。元のオブジェクトに実際には、人やポイント。
値によって渡された参照型の場合は、実際には、より多くの人気を理解すること:
1は、メモリアドレスの引数はパラメータに転送され、値によって渡された値がメモリアドレスを意味し;
2、パラメータ変更その目的および引数の共通点を、実際の参加者は、外部反射、
3しかし、新たなターゲットへのパラメータのポイントは、引数が新しいオブジェクトを指していない場合、ある監督パラメータメモリアドレスの引数を変更することができたことがありません。
3以上の点を踏まえ、当社は、上記のコードの結果が実行されて理解することができます。