ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript変数、値の転送、アドレスの転送、およびparameters_jqueryの関係

JavaScript変数、値の転送、アドレスの転送、およびparameters_jqueryの関係

WBOY
WBOYオリジナル
2016-05-16 15:48:571051ブラウズ

最初に収穫物をしばらく乾燥させます:

1.javascript 変数には 2 種類の値が含まれます。1 つは参照型の値、もう 1 つは基本型の値です。参照型には、配列、オブジェクト、関数が含まれます (非基本型は参照型であると理解できます)。5 つの基本型には、未定義、null、string、boolean、number

が含まれます。

2. 関数パラメータを渡すメカニズムは、変数値をコピーすることです。

本にはこう書いてあります: 「関数の外の値を関数内のパラメータにコピーすることは、ある変数から別の変数に値をコピーすることと同じです。基本型の転送は、基本型変数のコピーと同じです。と参照型の転送 参照型変数「

」のコピーと同じです。

" 変数が参照型の値をコピーすると、変数オブジェクトに格納されている値のコピーも、新しい変数に割り当てられた領域にコピーされます。違いは、値のコピーが実際にはポインターであることです。 、このポインターはヒープに格納されたオブジェクトを指します。コピー操作が完了すると、2 つの変数は実際には同じオブジェクトを参照します。そのため、一方の変数を変更すると、もう一方の変数に影響します。

[注: 参照型の値をコピーすることがアドレスを渡す唯一の方法です]

3. パラメーターは実際には関数のローカル変数です。

----------------------------------------------- --- --------------------------

基本概念の説明:

値の転送: A の値を B に転送し、B を変更します。A はそれに応じて変更されません。B は A と同じ値を保存します。

アドレスの転送: A のアドレスを B に転送し、B を変更すると、同時に A は A のアドレスのみを保存します (コンピューターのショートカットと同様)。

値型のデータはスタック上の変数に格納されます。つまり、スタックにメモリ空間を割り当て、含まれる値を直接格納すると、その値はデータそのものを表します。値型データの方がアクセス速度が速くなります。

参照型のデータはスタックには存在せず、ヒープに格納されます。つまり、ヒープ内にメモリ空間を割り当てることは、含まれている値を直接格納するのではなく、格納される値をポイントし、その値がポイントされたアドレスを表します。参照型でデータにアクセスする場合、ヒープ内の実際のデータを参照するスタック上の変数の内容を確認する必要があります。参照型データは値型データに比べて記憶サイズが大きく、アクセス速度が遅くなります。

----------------------------------------------- --- --------------------------

ここで 3 つの質問があります。

[質問 1]:

change(a) 関数を実行した後、a の外側が乱されないのはなぜですか?

<script>
var a = [1, 2, 3];
function change(a) {
 console.log(a);//[1,2,3]
 a = 2;   //传值
 console.log(a);//2
}
change(a);
console.log(a);  //[1,2,3] 
</script>

質問1の答え:change(a)の実行処理はこんな感じなので、まずchangeにオブジェクトa(配列)を渡した後、changeのパラメータaにコピーします。次に、a=2 は代入ステートメントであり、値渡しになります。このとき、a=2は値型であり、参照アドレスの発行を伴わない。したがって、外部の a には影響しません。

[質問 2]:

change(a) 関数を実行した後、外側が乱れるのはなぜですか?

<script>
 var a = [1, 2, 3];
 function change() { 
  a = 2;//传值
 }
 change();
 console.log(a);  //2 
</script>

質問 2 の答え:change() を実行するとき、関数は独自の実行環境でスコープ チェーンを検索します。アクティベーション オブジェクトには変数 a が含まれていないため、スコープ チェーンに沿って上方向に検索してグローバル実行を見つけます。環境では、変数 a が見つかります。このとき、関数の内部の a と外部の a はメモリ上の同じアドレスになります。当然、関数の内部の a が変更されると、外部の a も変更されます。

分析: 質問 2 と質問 1 の違いは、質問 2 ではパラメーターが導入されていないため、変数のコピーが含まれないことです。

[質問 3]:

change(a) 関数を実行した後、外側が乱れるのはなぜですか?

<script>
 var a = [1, 2, 3];
 function change(b) { 
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[2,2,3]
</script>

質問 3 の答え: これは質問 1 と非常に似ています。唯一の違いは、a=2 が b[0]=2 に置き換えられることです。最初はコピーではないでしょうか。パラメータ b はコピーされた値である必要がありますが、外側の a にどのような影響を与えることができますか?

確かに、変更関数を実行するとパラメータ b は a の値をコピーしたものになります。 a は参照型であるため、関数内では b と a が参照によってアドレス オブジェクトにアクセスします。 b[0]=2 が発生しても、b と a が関数内で同じオブジェクトを参照するという事実には影響しません。

[質問 4]:

change(a) 関数を実行した後、外部が乱されないのはなぜですか?

 var a = [1, 2, 3];
 function change(b) { 
  console.log(b);//[1,2,3]
  b=2;
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[1,2,3]

質問 4 の答え:change(b) の実行プロセスは次のとおりです。オブジェクト a がchange 関数に渡され、その値とアドレスが b にコピーされます。 b=2, b という文はこの時点で値型となり、アドレス参照の問題は発生しません。b[0]=2 という文は、この時点では b が配列ではなくなっているため、実際には意味がありません。当然のことながら、b[0] のようなインデックス作成メソッドはありません。したがって、実際には、b=2 以降、b と a のアドレス参照関係はなくなります。この時点では、外部 a はまだ [1,2,3];

以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。