code

Javascript에서 삭제 연산자의 목적은 무엇입니까?

codestyles 2020. 12. 1. 08:03
반응형

Javascript에서 삭제 연산자의 목적은 무엇입니까?


삭제 연산자의 동작은 매우 복잡해 보이며 실제로 수행하는 작업에 대해 많은 오해가 있습니다. 나에게 무언가를 재 할당 undefined하면 기대했던 것을 더 안정적으로 수행 할 수있을 것 같습니다.

delete실제로 비 예제 코드에서 사용되는 Javascript 키워드를 본 적이 없으며 특히 유용한 지 궁금합니다. 하는가 delete에 재 할당에 의해 acheived 할 수없는 목적을 가지고 undefined? 유명한 라이브러리 (예 : jQuery, dojo, 백본 등)에서 전혀 사용되지 않습니까?


삭제는 undefined로 재 할당하여 달성 할 수없는 목적이 있습니까?

예. 당신은 프로토 타입 또는 원인에서 속성을 마스크를 해제하려면 in, hasOwnProperty그리고 for (...in...)에없는 속성을 기록 한 후 기존의 것은으로 delete적합하다.

var set = {};

set._x = true;

alert('_x' in set);  // true

set._x = undefined;

alert('_x' in set);  // true

delete set._x;

alert('_x' in set);  // false

편집하다 : TJ Crowder가 설명하는대로 :

delete연산자 의 목적은 객체에서 속성을 완전히 제거하는 반면 속성을로 설정하면 속성이로 undefined설정됩니다 undefined.

이것은 그 자체로 중요하지만 상속을 사용할 때도 중요합니다. 왜냐하면 O가 P에서 파생되면

var P = { prop: 42 };
var O = Object.create(P);  // P is O's prototype.

검색 할 때 O.propO에 해당 이름의 속성이있는 경우 (값이 정의되지 않은 경우에도) O에서 prop 값을 가져 오지만 O에 속성이 전혀 없으면 P.prop대신 값이 검색 됩니다.

alert(O.prop);  // "42" since O doesn't have its own prop, but P does.
O.prop = undefined;
alert(O.prop);  // "undefined" since O has its own prop.
delete O.prop;
alert(O.prop);  // "42" since the delete "unmasked" P.prop.

Mike Samuel이 그의 답변에서 지적했듯이 delete의 가장 일반적인 사용법 중 하나는 객체를 이름과 값을 연결하는 "속성 백"으로 취급 할 때입니다. "이 이름은 이제 일부 가짜 값에 매핑 됨"과 "이 이름은 전혀 매핑되지 않음"간에 논리적으로 차이가 있습니다. "삭제"는 후자를 달성합니다.

그것은 모두 합리적으로 잘 이해되고 있습니다. JScript 1.0 ~ 5.0 엔진에 대한 흥미로운 역사적 메모를 추가 할 수있을 것이라고 생각했습니다.

JScript의 원래 Microsoft 구현에서는 OLE 자동화 스타일의 IDispatch 개체를 사용하여 expando 개체를 구현했습니다. 물론 IDispatch는 단순히 정수인 "dispatch id"와 이름을 연결하여 작동합니다. 동적으로 호출하려면 먼저 디스패치 객체에 이름과 연관된 디스패치 ID를 요청한 다음 "이 인수가 주어지면 이제이 ID와 연관된 메소드를 호출하십시오"라고 말합니다.

그것은 모두 좋고 좋습니다. 그러나 IDispatch 계약의 요구 사항 중 하나는 이름에서 디스패치 ID 로의 매핑 이 개체의 전체 수명 동안 안정적이라는 것 입니다. 따라서 누군가 "add property Foo to this object"라고 말하면 속성 Foo가 해당 객체의 디스패치 식별자 0x1234와 연관되어 있다고 결정할 수 있습니다. 그 순간부터 개체가 "Foo"의 디스패치 식별자를 요청받을 때마다 Foo가 삭제 된 후 다시 추가 되더라도 0x1234를 반환해야 합니다. 이를 통해 호출자는 모든 호출에서 항상 객체를 요청하지 않고 이름 / 디 스피드 쌍의 빠른 캐시를 유지할 수 있습니다.

그것의 실질적인 결과는 "삭제"가 어떤 식 으로든 그 구현에서 객체에 대한 메모리 부담을 줄이지 않는다는 것입니다 ! 속성을 삭제하면 (원래 구현에서) 디스패치 식별자가 삭제 된 것으로 표시하는 객체에 비트를 추가해야하지만 해당 이름이 다시 돌아 오는 경우 이름 / ID 쌍에 대한 모든 정보를 유지해야합니다. 개체에 엄청난 수의 속성을 추가 한 다음 모두 삭제해도 메모리의 개체가 축소되지 않습니다.

물론 JScript 엔진은 내 시간 이후로 완전히 재 작성 되었기 때문에 (파서와 렉서를 제외하고) 엔진이 여전히이 특이한 특징을 가지고 있는지 알 수 없습니다. 알아 내면 흥미로울 것입니다.


만약 당신이

 delete Foo.Bar;

객체 Foo에서 속성 Bar를 완전히 삭제합니다.

 Foo.Bar = undefined

Bar 속성을 정의되지 않은 상태로 설정하고 Foo.Bar여전히 존재합니다.


다른 답변은 delete키워드 의 동기를 설명하고 있습니다. 2017 년부터 브라우저 속성을 삭제할 때와 속성을 정의되지 않음으로 설정할 때 메모리 할당을 해제합니다 .

다음 예를 고려하십시오 ( 소스roughSizeOfObject() ).

> var obj = {a:42,b:"b"}; roughSizeOfObject(obj)
26
> obj.a = undefined; roughSizeOfObject(obj)
18
> delete obj.a; roughSizeOfObject(obj)
10
> obj.b = undefined; roughSizeOfObject(obj)
8
> delete obj.b; roughSizeOfObject(obj)
0

이 예제는 Chrome 61 (64 비트) 콘솔에서 가져온 것입니다 (의 모든 문자 String는 내부적으로 16 비트 부호없는 정수로 인코딩 됨).


다음 링크의 대답을 확인할 수 있습니다. 변수를 정의되지 않은 것으로 설정하거나 정의되지 않은 것을 인수로 전달할 수 있습니까? 차이를 매우 자세하게 설명합니다.

요약:

You can certainly assign undefined to it, but that won't delete the variable. Only the delete object.property operator really removes things.

delete is really meant for properties rather than variables as such. Browsers will let you get away with straight delete variable, but it's not a good idea and won't work in ECMAScript Fifth Edition's strict mode. If you want to free up a reference to something so it can be garbage-collected, it would be more usual to say variable= null.


Well, you'd end up with an element in your object that contains the value undefined. The key wouldn't be gone.

참고URL : https://stackoverflow.com/questions/8945276/what-is-the-purpose-of-the-delete-operator-in-javascript

반응형