【JS】配列は参照型である
JS逆引きレシピ本、027(P48)。
データ型には、「基本型」「参照型」の2種類があるらしい。
両者の違いは「値を変数に格納する方法」です(図2.1)。まず、基本型は値そのものを変数に格納します。対して、参照型では、値を実際に格納しているメモリ上のアドレス(=参照値)を変数に格納します。
例によって、読んで理解できる気はするものの完全な理解かと言われると心もとない。
自分流に言い換えると、こうだ。
ある家の住人、山田太郎さんのことを記録しておく台帳があるとする。
【基本型】
山田太郎さん自身を記録しており、どこに住んでいるかは関係ない。
逆に言うと、隣町に住んでいる同姓同名の山田太郎さんと、台帳の上では区別がつかない。
【参照型】
住所を記録して、「そこの住人」として台帳に記録する。
そのため、いつの間にか引っ越して鈴木一郎さんが住んでいると、いざ中身を見ようと思うと、住人情報としては山田さんではなく鈴木さんに変わっている。
また、隣町の山田太郎さんは、名前が一緒でも住所が違うので別人として扱われる。
作例でいうと、以下のようになる。
数値型は基本型、配列は参照型。
let i = 10; let j = 10; console.log(i == j); // true let m = ['赤' , '黃' , '青']; let n = ['赤' , '黃' , '青']; console.log(m == n); // false
値は同じだが、参照型は等価ではない。なぜなら、住所が違うから。
配列をこういう等価式で書くことはまずないが、何かのはずみで間違えそうではあるので、注意が必要だとは思う。
定数で参照型を使用する際の注意
上記の例は、「配列そのものを等価式で比較しない」と覚えてしまえば間違えないし、なんとなく無理そうってことは肌感としても理解できていたので、おそらく間違えることはない。
ただ、定数の例に関しては、考えていなかったので少し驚いた。
定数とは、再代入できない値のこと。
一度定義したら、値を変えようとしても変えられないもののことだ。
const i = 10; i = 20; // エラー
これは分かる。定数とはそういうものだから。
const m = ['赤' , '黃' , '青']; m = ['red' , 'yellow' , 'blue']; console.log(m[0]) // 'red'
……再代入できている。
これは、別に例外的な処理ではなく、要するに「住人が変わっただけで住所が変わっていないから」問題ないのである。
ぶっちゃけ、これは混乱しそう!である。
意味は完全に理解できるものの、やっちまいそうな空気をびしびし感じる。
配列は定数で宣言しない、と決めてしまうほうが早い気がするな。