[javascript] JavaScript에서 객체 삭제

JavaScript의 delete연산자 와 약간 혼동됩니다 . 다음 코드를 보자.

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

var foo = obj;

delete obj;

이 코드 조각이 실행 된 후에 obj는 is null이지만 foo여전히 정확히 같은 객체를 참조합니다 obj. 이 객체가 foo지적한 것과 동일한 객체라고 생각 합니다.

쓰기 가 변수뿐만 아니라 메모리에서 가리키는 delete obj객체를 삭제 한다고 기대했기 때문에 이것은 혼란 스럽습니다 .objobj

이 자바 스크립트의 쓰레기 때문에 콜렉터가 나는 물체를 가리키는 다른 변수를 가지고 있지 않은 경우, 그것은 그래서하는 유지 / 해제를 기준으로하고있다인가 것이다 메모리에서 제거?

(제 테스트는 Safari 4에서 수행되었습니다.)



답변

delete 연산자는 객체 자체가 아닌 참조 만 삭제합니다. 객체 자체를 삭제 한 경우 C ++ 삭제와 같이 다른 나머지 참조는 매달려 있습니다. (둘 중 하나에 액세스하면 충돌이 발생합니다. 모두 널 (null)로 설정하면 각 오브젝트에 대해 메모리를 추가하거나 삭제할 때 추가 작업이 필요합니다.)

Javascript는 가비지 수집되므로 객체 자체를 삭제할 필요가 없습니다. 더 이상 참조 할 방법이 없으면 객체가 제거됩니다.

가비지 수집기에서 회수 할 수있는 항목에 대한 자세한 정보를 제공하므로 개체에 대한 참조를 완료하면 객체에 대한 참조를 삭제하는 것이 유용 할 수 있습니다. 참조가 큰 객체에 남아 있으면 프로그램의 나머지 부분에서 실제로 해당 객체를 사용하지 않더라도 참조가 회수되지 않을 수 있습니다.


답변

delete명령은 일반 변수에는 영향을 미치지 않으며 속성에만 영향을줍니다. delete명령 후에 속성에 값 null이 없으면 전혀 존재하지 않습니다.

특성이 객체 참조 인 경우 delete명령은 특성을 삭제하지만 오브젝트는 삭제하지 않습니다. 가비지 수집기는 개체에 대한 다른 참조가없는 경우 개체를 처리합니다.

예:

var x = new Object();
x.y = 42;

alert(x.y); // shows '42'

delete x; // no effect
alert(x.y); // still shows '42'

delete x.y; // deletes the property
alert(x.y); // shows 'undefined'

(Firefox에서 테스트되었습니다.)


답변

“암시 적으로 선언 된 변수”는 전역 객체의 속성이므로 모든 속성에서 작동하는 것처럼 delete 작동합니다. var로 선언 된 변수는 파기 할 수 없습니다.


답변

Mozilla 문서에서 “삭제 연산자를 사용하여 내재적으로 선언 된 변수를 삭제할 수 있지만 var 문으로 선언 된 변수는 삭제할 수 없습니다.”

링크는 다음과 같습니다. https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator


답변

delete Java Script에서 객체를 삭제하는 데 사용되지 않습니다.

deleteobject key귀하의 경우 에 제거에 사용

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

객체가 삭제되지 않았는지 확인하십시오 .obj는 여전히 동일한 값을 사용합니다.

delete obj.helloText

확인 obj, foo하고 둘 다 빈 객체입니다.


답변

이 문제에 비추어 흥미로운 것으로 생각 되는 jsperf 를 발견했습니다 . (사진을 완성하기 위해 보관하는 것이 편리 할 수 ​​있습니다)

delete , null 설정 및 undefined 설정을 비교합니다 .

그러나 속성을 여러 번 삭제 / 설정 한 경우를 테스트한다는 점에 유의하십시오.


답변

GC 질문 외에도 성능을 위해 브라우저가 백그라운드에서 수행 할 수있는 최적화를 고려해야합니다->

http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/

Chrome에서 사용하는 비하인드 ‘클래스’를 변경할 수 있으므로 참조를 삭제하는 것보다 참조를 null 처리하는 것이 좋습니다.