JavaScript의 delete
연산자 와 약간 혼동됩니다 . 다음 코드를 보자.
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
이 코드 조각이 실행 된 후에 obj
는 is null
이지만 foo
여전히 정확히 같은 객체를 참조합니다 obj
. 이 객체가 foo
지적한 것과 동일한 객체라고 생각 합니다.
쓰기 가 변수뿐만 아니라 메모리에서 가리키는 delete obj
객체를 삭제 한다고 기대했기 때문에 이것은 혼란 스럽습니다 .obj
obj
이 자바 스크립트의 쓰레기 때문에 콜렉터가 나는 물체를 가리키는 다른 변수를 가지고 있지 않은 경우, 그것은 그래서하는 유지 / 해제를 기준으로하고있다인가 것이다 메모리에서 제거?
(제 테스트는 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에서 객체를 삭제하는 데 사용되지 않습니다.
delete
object 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 처리하는 것이 좋습니다.