JavaScriptの値を分類すると値を一つだけ持つ「プリミティブ値」と複数の値を持つことが出来る「オブジェクト」に分類。
プリミティブ値
プリミティブ値は値の保持が1つだけ。なので配列はプリミティブ値ではない。
プリミティブ値の型は5種類のみ
- Null型
- Undefined型
- Boolean型
- Number型
- String型
型の種類は意外と少ないのでとっつきやすい^^
プリミティブ値のコピーは値渡しなので、コピーした値を変更しても元の値は変わらない
var a = "あ";
var b = a;
b="い";
console.log(a); // あ(もとの値は変わらない)
プリミティブ値は関数の引数として渡しても、元の値が変わらない
function countUp(cnt){
cnt++;
}
var cnt = 0; // Number型のプリミティブ値を定義
console.log(cnt); // 0
countUp(cnt); // プリミティブ値を引数にして関数を呼び出し
console.log(cnt); // 0 (プリミティブ値は値が変わらない)
オブジェクト
プリミティブ値以外の値はオブジェクト。オブジェクトは値を複数持つことが出来る
最初から使える組み込みオブジェクトの種類は7種類
- Object
- Array
- RegExp
- Function
- String
- Number
- Boolean
大もとはObjectクラス。他のオブジェクトはObjectクラスから継承したインスタンスという事らしい。
オブジェクトのコピーや関数への引数とした場合は参照渡しとなり、もとの値が変わる。プリミティブ値との違いとして把握しておかなきゃいけない。
オブジェクトをコピーした時の動作
var obj1 = { a : "あ" };
var obj2 = obj1; // オブジェクトのコピー
obj2.a = "い"; // コピーしたオブジェクトで値を変更
console.log(obj1.a); // い (もとの値が変わる)
オブジェクト関数の引数として渡した時の動作
function objCountUp(obj){
obj.cnt++;
}
function aryCountUp(ary){
ary[0]++;
}
var obj = { cnt : 0 }; // Object型
var ary = [0,1,2]; // Array型
console.log(obj.cnt); // 0
objCountUp(obj);
console.log(obj.cnt); // 1(オブジェクトなので値が変わる)
console.log(ary[0]); // 0
aryCountUp(ary);
console.log(ary[0]); // 1(Arrayもオブジェクトなので値が変わる)
プリミティブ値なのかオブジェクトなのかで、値渡しなのか参照渡しなのかを意識しておかないとね^^