どのように、プリミティブ型とオブジェクト型が参照されるのか。
その挙動をまとめていきます。
プリミティブ型とオブジェクト型
・データ型ではプリミティブ型とオブジェクト型が存在する。
・オブジェクトは参照を名前付きで管理している入れ物である。
オブジェクトは値を管理しているプロパティを管理している。
参照とコピー
参照の使い方・・・ 例)let a = ‘hello’ aはhelloへの参照を保持している
プリミティブ値のコピー
・参照先の値がコピーされる let a = 0; let b = a;
let a = 'hello';
let b = a;
b= 'bye';
console.log(a,b); //hello,bye
オブジェクトのコピー
・オブジェクトへの参照がコピーされる(. {}がコピーされる) let a = {prop:1} let b = a; b = {}
let c = {
prop:'hello',
}
let d = c;
d.prop = 'bye';
console.log(c,d) // prop:bye, prop:bye c,d同じ
let c = {
prop:'hello',
}
let d = c;
d = {
maso:'keoo'
}
d.prop = 'bye';
console.log(c,d) // prop:hello, maso:keoo prop:bye
const と 参照
constの時は参照先がロックされる。
又、オブジェクトは{}をロックするのでオブジェクト内のプロパティの値を変化することは可能
const a = 'hello';
a = 'changed'
console.log(a); //error
const c = {
prop:'hello'
}
c.prop = 'aaaa';
console.log(c); //prop:aaaa
参照と引数
プリミティブ型の値を関数の引数にする場合、
引数の値と、
関数内の値はお互いに影響は受けない
let a = 0;
function fn1(arg1){
arg1 = 1;
console.log(a,arg1);
}
fn1(a); //0,1 タイトル下はこの時のことを指すよ
let b = {
prop:0
}
function fn2(arg2){
arg2.prop = 1;
console.log(b,arg2);
}
fn2(b); //prop:1,prop:1 この時、参照元の値が変更されているため、同じ{}から値を取得しているbも変化する
function fn3(arg2){
arg2 = {};
console.log(b,arg2);
}
fn3(b); // prop:1 ,{}
参照と分割代入
let (a,b) = object;
オブジェクトから特定のプロパティを抽出して宣言を行う
const a = {
prop:0
}
let {prop} = a; // prop が保存される
prop = 1;
console.log(prop); //1
console.log(a.prop); //0
function fn(obj){
let { prop } = obj;
prop= 1;
console.log(a,prop); // prop:0,1
}
上と同じ ({ })バージョン
/*--
function fn({prop}){
prop= 1;
console.log(obj,prop);
}
--*/
参照の比較
const a = {
prop:0
}
const b = {
prop:0
}
console.log(a === b); //false
console.log(a.prop === b.prop); //true