Javascript プリミティブ型とオブジェクト型の参照

どのように、プリミティブ型とオブジェクト型が参照されるのか。
その挙動をまとめていきます。

プリミティブ型とオブジェクト型

・データ型ではプリミティブ型とオブジェクト型が存在する。

・オブジェクトは参照を名前付きで管理している入れ物である。
オブジェクトは値を管理しているプロパティを管理している。

参照とコピー

参照の使い方・・・ 例)let a = ‘hello’   ahelloへの参照を保持している

プリミティブ値のコピー
・参照先の値がコピーされる  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

 

投稿者 @rongai