<javascript>データ型の種類と参照型の値を取り扱う際の注意点
データ処理:型の種類
javascriptで取り扱うデータには、大きく分けて2種類あります。
- 基本型(プリミティブ型)
- 参照型(オブジェクト型)
基本型(プリミティブ型)
- 数値型(number)
- 文字列型(string)
- 論理値型(boolean)
- 特殊型(null/undifind)
特長
- 変数には、値が直接格納される
- 値の受け渡し時には、値そのものが受け渡される
var a, b; a = 0; b = a; b = 5; console.log(b); // 5 console.log(a); // 0 <-値自体が受け渡されたため、aは変わらない
参照型(オブジェクト型)
- オブジェクト(object)
- 配列(array)
- 関数(function)
特長
- 変数には値が格納されている配列の場所(メモリアドレス)が格納される
- 値が変更されると、配列自体の値が変更されるため、参照先が同じになっている変数全てに影響がある
var a, b; c = [0,1,2]; d = c; d[0] = 7; console.log(d) // [7,1,2] console.log(c) // [7,1,2] <- 参照先が渡されたため、cも変わる
この場合、 dは参照するアドレスがcから受け渡されたため、dが参照している配列=cが参照している配列となります。 そのため、dで配列の中身を編集すると、cも同じく変化してしまいます。
オブジェクトの値についての注意
オブジェクトは参照型ですが、 下記のような例では、一見して基本型と同じような挙動に見えます。
var e, f; e = document.getElementById("hoge"); f = e; f = document.getElementById("fuga"); //この時点で新しい参照先が作成される console.log(e) // <div id='hoge'></div> console.log(f) //<div id='fuga'></div> (eは変わらない)
この場合、f=eのときに、eの参照先をコピーしたのではなく、 fが新しい参照先を作成したため、eとfが異なる状態となります。