자바스크립트에서 원시 타입의 데이터(원시 자료형(primitive data types))는 객체가 아니면서 method를 가지지 않는 6가지의 타입을 말합니다.
string
,number
,boolean
,undefined
,symbol
,bigint
, (null
)
'string', 42, true, false, undefined..
자바스크립트에서 원시 자료형이 아닌 모든 것은 참조 자료형(참조 타입(reference data type))입니다.
배열([])
, 객체({})
, 함수(function(){})
가 대표적입니다.
참조 자료형에는 데이터 보관함(메모리)에 저장할 때 하나의 데이터가 아니라 '여러' 데이터를 담을 수 있습니다.
이때 '여러' 데이터는 데이터 보관함(메모리)의 동적으로 크기가 변하는 heap이라는 공간에 저장됩니다. 변수에는 실제 데이터가 위치한 곳(메모리 상 주소)을 가리키는 주소가 저장됩니다.
이처럼 데이터는 heap이라는 메모리 공간에서 별도로 관리되고, 우리가 직접 다루는 변수에는 메모리 주소가 저장되기 때문에 reference data type이라고 불립니다.
참조 자료형의 ===
(strict equality)는 주소값이 같은지 확인합니다.
따라서, 아래의 값은 각각 다른 메모리 주소값을 가지고 있기 때문에 모두 false가 나옵니다.
// 메모리 heap 영역에서는 두 개의 저장 공간이 할당된 상태 입니다.
console.log([1,2,3] === [1,2,3]); // false
console.log({foo: 'bar'} === {foo: 'bar'}); // false
const nums1 = [1, 2, 3]; // [1, 2, 3]이 heap에 저장되고, 이 위치의 주소가 변수 num1에 저장됩니다.
const nums2 = [1, 2, 3]; // [1, 2, 3]이 heap에 저장되고, 이 위치의 주소가 변수 num2에 저장됩니다.
// 이제 heap에는 두 개의 [1, 2, 3]이 저장되어 있고, 각각에 대한 주소가 변수 num1, num2에 저장되어 있습니다.
console.log(num1 === num2); // false