> 웹 프론트엔드 > JS 튜토리얼 > JavaScript 불변성과 참조 유형 이해

JavaScript 불변성과 참조 유형 이해

Linda Hamilton
풀어 주다: 2025-01-06 02:14:39
원래의
461명이 탐색했습니다.

Understanding JavaScript Immutability and Reference Types

불변성과 참조 유형에 관한 JavaScript의 동작은 기본적이지만 종종 오해됩니다. 불변성은 데이터의 안정성을 보장하는 반면, 의도하지 않은 부작용을 방지하려면 참조 유형을 이해하는 것이 중요합니다. 이러한 개념을 자세히 살펴보고 해당 기능을 효과적으로 활용하는 데 도움이 되는 고급 예제와 유틸리티 기능을 살펴보겠습니다.


JavaScript의 불변성

불변성은 객체 생성 후 객체의 상태를 변경할 수 없다는 개념을 의미합니다. JavaScript에서 기본 값(예: 숫자, 문자열, 부울)은 본질적으로 변경할 수 없지만 참조 유형(예: 객체, 배열)은 기본적으로 변경 가능합니다.

불변성이 중요한 이유

  • 예측 가능한 상태 관리
  • 더 쉬워진 디버깅
  • 함수 부작용 방지

변경 가능한 데이터와 불변 데이터의 예

// Mutable Example
const mutableArray = [1, 2, 3];
mutableArray.push(4); // The original array is modified
console.log(mutableArray); // [1, 2, 3, 4]

// Immutable Example
const immutableArray = [1, 2, 3];
const newArray = [...immutableArray, 4]; // Creates a new array
console.log(immutableArray); // [1, 2, 3]
console.log(newArray);       // [1, 2, 3, 4]
로그인 후 복사
로그인 후 복사

참조 유형과 그 특징

참조 유형(객체, 배열, 함수)은 참조로 메모리에 저장됩니다. 변수나 함수에 할당하거나 전달해도 해당 값은 복사되지 않습니다. 참조를 복사합니다.

:

const obj1 = { name: "Alice" };
const obj2 = obj1;

obj2.name = "Bob";

console.log(obj1.name); // "Bob" - Both variables point to the same reference
로그인 후 복사

깊은 복사본과 얕은 복사본

  • 얕은 복사본은 새 개체를 생성하지만 중첩된 개체나 배열은 복사하지 않습니다.
  • 전체 복사는 중첩된 요소를 포함한 전체 구조를 복제합니다.

얕은 복사 예:

const obj = { name: "Alice", details: { age: 25 } };
const shallowCopy = { ...obj };

shallowCopy.details.age = 30;
console.log(obj.details.age); // 30 - Nested objects are still linked
로그인 후 복사

깊은 복사 예시:

const deepCopy = JSON.parse(JSON.stringify(obj));
deepCopy.details.age = 35;
console.log(obj.details.age); // 25 - Original object remains unchanged
로그인 후 복사

불변성 및 참조 안전성을 위한 유틸리티 기능

1. 중첩 객체의 불변 업데이트

function updateNestedObject(obj, path, value) {
  return path.reduceRight((acc, key, index) => {
    if (index === path.length - 1) {
      return { ...obj, [key]: value };
    }
    return { ...obj, [key]: acc };
  }, value);
}

// Example
const state = { user: { name: "Alice", age: 25 } };
const newState = updateNestedObject(state, ["user", "age"], 30);
console.log(newState); // { user: { name: "Alice", age: 30 } }
로그인 후 복사

2. 딥 클로닝 유틸리티

function deepClone(obj) {
  return structuredClone ? structuredClone(obj) : JSON.parse(JSON.stringify(obj));
}

// Example
const original = { a: 1, b: { c: 2 } };
const clone = deepClone(original);
clone.b.c = 42;

console.log(original.b.c); // 2 - Original remains unaffected
로그인 후 복사

3. 완전한 불변성을 위한 객체 동결

function deepFreeze(obj) {
  Object.freeze(obj);
  Object.keys(obj).forEach((key) => {
    if (typeof obj[key] === "object" && !Object.isFrozen(obj[key])) {
      deepFreeze(obj[key]);
    }
  });
}

// Example
const config = { api: { url: "https://example.com" } };
deepFreeze(config);

config.api.url = "https://changed.com"; // Error in strict mode
console.log(config.api.url); // "https://example.com"
로그인 후 복사

4. 불변 배열 연산

function immutableInsert(array, index, value) {
  return [...array.slice(0, index), value, ...array.slice(index)];
}

function immutableRemove(array, index) {
  return [...array.slice(0, index), ...array.slice(index + 1)];
}

// Example
const arr = [1, 2, 3, 4];
const newArr = immutableInsert(arr, 2, 99); // [1, 2, 99, 3, 4]
const removedArr = immutableRemove(arr, 1); // [1, 3, 4]
로그인 후 복사

고급 예

1. Redux 스타일 아키텍처에서 불변 상태 관리

const initialState = { todos: [] };

function reducer(state = initialState, action) {
  switch (action.type) {
    case "ADD_TODO":
      return { ...state, todos: [...state.todos, action.payload] };
    case "REMOVE_TODO":
      return {
        ...state,
        todos: state.todos.filter((_, index) => index !== action.index),
      };
    default:
      return state;
  }
}
로그인 후 복사

2. 비동기 함수의 참조 버그 방지

// Mutable Example
const mutableArray = [1, 2, 3];
mutableArray.push(4); // The original array is modified
console.log(mutableArray); // [1, 2, 3, 4]

// Immutable Example
const immutableArray = [1, 2, 3];
const newArray = [...immutableArray, 4]; // Creates a new array
console.log(immutableArray); // [1, 2, 3]
console.log(newArray);       // [1, 2, 3, 4]
로그인 후 복사
로그인 후 복사

불변성 및 참조 처리 모범 사례

  • 최상위 업데이트에는 항상 얕은 복사본을 사용하세요: 스프레드 구문이나 Object.Assign을 사용하세요.
  • 심층 복제를 위한 라이브러리 선호: Lodash(cloneDeep)와 같은 라이브러리는 강력한 솔루션을 제공합니다.
  • 공유 변경 가능 상태 최소화: 명확한 소유권 구조 없이 함수 간에 객체를 전달하지 마세요.
  • 상태 관리에 불변성 활용: Redux 및 Immer와 같은 도구는 불변 상태 업데이트를 직관적으로 만듭니다.
  • 읽기 전용 구성에 Object.freeze 사용: 상수가 변경되지 않은 상태로 유지되는지 확인하세요.

결론

견고하고 유지 관리가 가능한 JavaScript 애플리케이션을 작성하려면 불변성과 참조 유형 이해가 필수적입니다. 유틸리티 기능을 활용하고 모범 사례를 준수함으로써 버그를 방지하고 상태 관리를 단순화하며 원활하게 확장되는 코드를 생성할 수 있습니다.

위 내용은 JavaScript 불변성과 참조 유형 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿