最初に収穫物をしばらく乾燥させます:
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>
[質問 2]:
change(a) 関数を実行した後、外側が乱れるのはなぜですか?
<script> var a = [1, 2, 3]; function change() { a = 2;//传值 } change(); console.log(a); //2 </script>
分析: 質問 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>
確かに、変更関数を実行するとパラメータ 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]
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。