programing

JavaScript에서 delete vs setting 요소를 null로 언제 사용해야합니까?

nasanasas 2020. 11. 13. 08:23
반응형

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 객체를 참조하고 그 반대의 경우도 마찬가지 임).

모든 참조를 제거했는지 확인하면 괜찮습니다.

참고 URL : https://stackoverflow.com/questions/1947995/when-should-i-use-delete-vs-setting-elements-to-null-in-javascript

반응형