JavaScript에서 delete vs setting 요소를 null로 언제 사용해야합니까?
중복 가능성 :
JavaScript에서 객체 삭제
많은 속성을 가진 JS 개체가 있습니다. 브라우저가이 개체를 가비지 수집하도록 강제하려면 이러한 각 속성을 null로 설정해야합니까? 아니면 delete 연산자를 사용해야합니까? 둘의 차이점은 무엇입니까?
JavaScript에서 가비지 수집을 강제하는 방법은 없으며 실제로 그럴 필요도 없습니다. x.y = null;
그리고 delete x.y;
둘 다 x
의 이전 값에 대한의 참조를 제거 y
합니다. 값은 필요할 때 가비지 수집됩니다.
속성을 null로 설정해도 여전히 개체에서 '설정'된 것으로 간주되어 열거됩니다. 내가 선호하는 곳을 생각할 수있는 유일한 delete
경우는의 속성을 열거 하려는 경우입니다 x
.
다음을 고려하세요:
var foo = { 'a': 1, 'b': 2, 'c': 3 };
console.log('Deleted a.');
delete foo.a
for (var key in foo)
console.log(key + ': ' + foo[key]);
console.log('Nulled out b.');
foo['b'] = null;
for (var key in foo)
console.log(key + ': ' + foo[key]);
이 코드는 다음 출력을 생성합니다.
Deleted a.
b: 2
c: 3
Nulled out b.
b: null
c: 3
Javascript 객체 속성은 일반적으로 해시 테이블로 구현됩니다. null로 설정하면 해시 테이블의 키가 null 값을 가리키는 반면 delete는 키와 값을 모두 제거합니다.
둘 사이의 주요 차이점은 for..in 루프를 사용하여 키를 반복하는 경우 키를 삭제하면 반복에서 표시되는 항목 수가 줄어든다는 것입니다.
해시 테이블 구조를 그대로 두어야하는 동일한 키를 반복적으로 설정하고 지우지 않는 한 일반적으로 삭제를 선호하는 것이 좋습니다. 그러나 두 기술 간의 성능 차이는 일반적인 경우에 헤아릴 수 없을 정도로 작을 것입니다.
-미디엄@
JavaScript에서 특정 시간에 가비지 수집을 강제하는 방법은 없습니다. 각 JavaScript 엔진에는이를 처리하는 고유 한 방법이 있습니다.
하지만 할 수있는 일은 객체가 어디에도 참조되지 않도록하는 것입니다. null로 설정하거나 삭제하는 것은 실제로 동일한 작업을 수행합니다 (delete는 객체를 삭제하지 않고 객체에 대한 참조 만 제거함). 가비지 수집이 실행되면 주어진 객체에 대한 참조가 있는지 확인한 다음 그렇지 않은 경우 메모리에서 제거합니다. 여기에서 메모리 누수가 발생합니다 (JavaScript 객체는 DOM 객체를 참조하고 그 반대의 경우도 마찬가지 임).
모든 참조를 제거했는지 확인하면 괜찮습니다.
'programing' 카테고리의 다른 글
css h1-텍스트 너비 만 (0) | 2020.11.14 |
---|---|
Vagrant는 VirtualBox 공유 폴더를 마운트 할 수 없습니다. (0) | 2020.11.13 |
Django에서 클라이언트 측 캐싱과 싸우기 (0) | 2020.11.13 |
같은 줄에 표시 할 라디오 버튼 및 레이블 (0) | 2020.11.13 |
HTML 양식 숨겨진 요소를 사용하여 배열 전달 (0) | 2020.11.13 |