
원시 값과, 참조 값이 있다.
원시 값이란
let a = 1;
let b = a;
- 라고 변수를 선언하고 할당을 하면은 메모리에서는 두 개의 주소가 생성이 된다.
- 같은 주소를 참조 할꺼 같지만 사실은 두 개의 주소가 만들어 진다.
- 원시 값은 불변해야 하기 떄문에 이렇게 만들어진다.
참조값
- 객체를 생성하고 새로운 변수를 만들어 객체를 할당해 주면은 원시 값과 마찬가지로 새로운 주소를 참조 할꺼같지만
- 참조 값은 주소를 바라보고 그 안에 프로퍼티 값을 참조 하고 있다.
- 여기서 하나의 객체를 변경을 한다면 2개의 객체의 프로퍼티 값이 변경이 된다. 이를 가변성이라고 한다.
// 참조 값 예시
let obj1 = { name: "Alice" }; // 객체 생성
let obj2 = obj1; // obj2는 obj1이 참조하는 동일한 객체를 참조
console.log(obj1.name); // "Alice"
console.log(obj2.name); // "Alice"
// obj1의 프로퍼티 변경
obj1.name = "Bob";
console.log(obj1.name); // "Bob" (변경된 값)
console.log(obj2.name); // "Bob" (동일 객체를 참조하므로 값이 변경됨)
// obj2로 프로퍼티 변경
obj2.name = "Charlie";
console.log(obj1.name); // "Charlie"
console.log(obj2.name); // "Charlie"
가비지컬렉션
- C언어는 메모리를 개발자가 관리해야 하지만, JS에서는 가비지컬렉션이 메모리를 청소해준다.
- 이 가비지는 루트 부모에서 부터 아래로 사용하지 않는 값이 있는지 체크를 하고 사용하지 않는 값이 있다면 이를 삭제한다.
- 여기서 문제는 값을 만들어 계속 참조를 한다면 가비지는 이를 삭제하지를 못한다.
function createLeakedObject() {
const obj = {}; // 새로운 객체 생성
return function () {
console.log(obj); // 클로저가 obj를 계속 참조
};
}
const leakedFn = createLeakedObject(); // 클로저 함수 생성
// obj는 더 이상 필요하지 않지만, leakedFn이 obj를 참조하고 있음
leakedFn(); // obj가 콘솔에 출력됨
// obj를 참조하는 leakedFn 때문에 obj는 가비지 컬렉션의 대상이 되지 않음
'자바스크립트' 카테고리의 다른 글
JS 아코디언 구현하기 (1) | 2025.01.19 |
---|---|
JS 설문조사 창 구현하기 (0) | 2025.01.19 |
원시와, 객체에 대한 메모리 (1) | 2025.01.16 |
왜 웹 개발은 Javascript로만 해야할까? (0) | 2025.01.11 |
html , js 정규식 (0) | 2024.12.31 |