#はじめに
プログラムには、値型と参照型というのがあるらしいです。
自分の情報の整理のために書きます。(間違えたことも書いてると思います...)
例を多く使って整理していきます。
間違いなど指摘してくだされば、うれしいです...
また、javascript,TypeScript,C#など、ごちゃごちゃに書いてしまっています。申し訳ないです...
- 値型は、構造体
- 参照型は、クラス
みたいなかんじらしいです。
これだけだと、よくわからないですね...
##値型 の奴ら (よく使うものだけ...)
- int
- double
- float
- number
- bool
- enum
##参照型 の奴ら (よく使うものだけ...)
- クラス(newするやつ)
- 配列
- オブジェクト
#この2つの違いについて
値型と参照型の違いは
『値型はコピー』、**『参照型はショートカット』**みたいな感じ。
例で考えた方が分かりやすいので、下記で説明
##値型 (number,int,float...の場合)
let num = 0;
change(num);
console.log(num);
function change(num) {
num = 10;
}
change
メソッドの引数に、変数num
をわたして
console.log
で変数の中身を見てみると、
num = 0
になりますね。
変数の中身のコピーをchange
メソッドの引数に渡しただけなので変化なしです
では、次...
##参照型 (配列の場合)
let numArr = [0, 1, 2];
change(numArr);
// "numArr = [10, 1, 2]"
console.log(numArr);
function change(numArr) {
numArr[0] = 10;
}
change
メソッドの引数に、変数numArr
をわたしてconsole.log
で中身を見てみると、
numArr = [10, 1, 2]
になります。
!?って感じでした...
予想では
numArr = [0, 1, 2]
だったのに...
先ほども言ったように、参照型である配列は
変数に入れた時、変数は中身のショートカットのような扱いになります。
**『ショートカットのような扱い』**をもっと分かりやすく説明すると
下記のような感じになります。
let arr0 = [0, 1, 2];
let arr1 = arr0;
let arr2 = arr1;
arr2[0] = 10;
console.log(arr0);
console.log(arr1);
console.log(arr2);
これも私の予想では
arr0 = [0, 1, 2]
arr1 = [0, 1, 2]
arr2 = [10, 1, 2]
でしたが、
実際に動かすと...
arr0 = [10, 1, 2]
arr1 = [10, 1, 2]
arr2 = [10, 1, 2]
でした...
変数arr0
の中身を、変数arr1
arr2
に入れると
中身は共通のものになるんですね...
配列を使うときは気を付けたいです...
##じゃあこの場合はどうなるのか...?
さっきまでは、arr[0] = 10;
のように配列の中身を変えていました
では、次の場合にはどうなるんだろう..
let arr0 = [0, 1, 2];
let arr1 = arr0;
arr1 = [10, 1, 2];
console.log(arr0);
これを実際に動かすと、console.log
では
arr0 = [0, 1, 2]
と出ます。
この場合は、
『配列の中身を変える』
ではなく、
『新しい配列に入れ替える』
っていう感じになるのかなと思いました。
#まとめ
配列やクラス(とくに配列)を使うときは、値型のように使わないように気を付けないと...
というのが、学べました。
値型と参照型、それぞれの特徴をもっと理解すれば、もっと上手にプログラムを組めるのかなと思います...
値型や参照型について、さらに詳しいことを知っている方がいましたら、コメントなどで教えていただけると嬉しいです。