> 웹 프론트엔드 > JS 튜토리얼 > 왜 `delete obj`가 JavaScript에서 `foo`도 삭제하지 않습니까?

왜 `delete obj`가 JavaScript에서 `foo`도 삭제하지 않습니까?

Barbara Streisand
풀어 주다: 2024-11-30 08:10:14
원래의
264명이 탐색했습니다.

Why Doesn't `delete obj` Also Delete `foo` in JavaScript?

JavaScript의 삭제 연산자 자세히 알아보기

언급하신 것처럼 JavaScript의 삭제 연산자는 혼란을 초래할 수 있습니다. 제공한 코드 조각을 살펴보겠습니다.

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;
로그인 후 복사

이 코드를 실행한 후 obj를 삭제하려고 시도했기 때문에 obj와 foo가 모두 null일 것으로 예상할 수 있습니다. 그러나 이는 사실이 아니다. obj는 null이 되지만 foo는 여전히 obj가 가리키는 동일한 객체를 참조합니다.

객체 참조 이해

이 동작을 이해하는 열쇠는 JavaScript의 객체 참조 시스템에 있습니다. . JavaScript 객체는 참조 유형입니다. 즉, 실제 데이터가 아닌 메모리 주소를 보유합니다. 위의 예에서 obj와 foo는 메모리의 동일한 주소, 즉 "helloText" 속성을 포함하는 객체를 가리키는 두 개의 다른 변수입니다.

가비지 수집의 역할

JavaScript는 참조되지 않은 객체를 메모리에서 자동으로 제거하는 가비지 수집 메커니즘을 사용합니다. 그렇다면 delete obj를 사용해도 객체가 삭제되지 않는 이유는 무엇일까요?

삭제 연산자의 동작

JavaScript의 삭제 연산자는 실제로 객체 자체를 삭제하지 않습니다. 대신 해당 항목에 대한 참조만 삭제합니다. 객체 자체를 삭제하면 foo와 같은 다른 참조가 존재하지 않는 위치를 가리키게 되어 오류가 발생하기 때문입니다.

가비지 수집에 대한 의미

이후 delete는 단지 객체에 대한 참조를 제거할 뿐이며, 가비지 수집기는 객체를 삭제해야 하는 시기를 결정합니다. 코드에 객체에 대한 다른 참조가 없으면 가비지 수집 대상이 되어 메모리에서 제거됩니다.

모범 사례

삭제 연산자를 사용하는 방법은 다음과 같습니다. 성능 향상이 보장되지 않고 코드 디버깅을 더 어렵게 만들 수 있으므로 일반적으로 권장되지 않습니다. 그러나 이를 사용하면 더 이상 필요하지 않은 개체에 대한 참조를 명시적으로 제거하여 가비지 수집기의 정리 프로세스를 지원할 수 있습니다.

위 내용은 왜 `delete obj`가 JavaScript에서 `foo`도 삭제하지 않습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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