참조 타입은 값 자체가 아닌 메모리 주소(참조)를 통해 데이터를 다루는 타입이다.
객체, 배열, 함수 등 복잡한 구조의 데이터가 여기에 속한다.
타입 | 설명 | 예시 |
---|---|---|
Object | 키-값 쌍의 데이터 구조 | { name: "John", age: 30 } |
Array | 순서가 있는 리스트 | [1, 2, 3] |
Function | 실행 가능한 코드 | function() { return 1; } |
Date | 날짜 및 시간 정보 | new Date() |
RegExp | 정규 표현식 | /ab+c/ |
기타 | Map , Set , WeakMap , WeakSet 등 ES6 이후 추가된 컬렉션 타입들 |
변수에는 실제 값이 아닌 객체가 저장된 메모리 주소(참조)가 저장된다.
let obj1 = { name: "Alice" };
let obj2 = obj1;
ob2.name = "Bob";
console.log(obj1.name); // "Bob"
→ obj1
과 obj2
는 같은 객체를 가리키고 있기 때문에, 하나를 수정하면 다른 쪽에도 영향을 미친다.
// 얕은 복사
let original = { a: 1 };
let copy = original;
copy.a = 2;
console.log(original.a); // 2
// 깊은 복사
let deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.a = 100;
console.log(original.a); // 2
console.log(deepCopy.a); // 100
typeof {}; // "object"
typeof []; // "object"
typeof function(){} // "function" ← 특별 처리됨
typeof null; // "object" ← 버그로 인해 이 결과가 나옴
null
이object
로 나오는 건 오래된 JS 설계 실수지만, 지금도 그대로 유지되고 있다.
참조 타입은 속성(property)과 메서드(method)를 가질 수 있다:
let user = {
name: "Jane",
greet: function() {
console.log("Hello!");
}
};
console.log(user.name); // "Jane"
user.greet(); // "Hello!"
자바스크립트에서는 함수도 일급 객체(First-class object)로 취급되며 참조 타입이다:
function greet() {
return "Hello";
}
let fn = greet;
console.log(fn()); // "Hello"
항목 | 원시 타입 | 참조 타입 |
---|---|---|
저장 방식 | 값 자체 | 메모리 참조 (주소) |
복사 시 | 값 복사 (독립적) | 참조 복사 (공유됨) |
변경 가능성 | 불변 (immutable) | 변경 가능 (mutable) |
크기 | 작음 | 상대적으로 큼 |
typeof 결과 | string , number , 등 | object , function 등 |
typeof
결과 대부분 "object"