programing

a.x 삭제 대 a.x = 정의되지 않음

topblog 2023. 8. 1. 20:14
반응형

a.x 삭제 대 a.x = 정의되지 않음

이것들 중 어느 것을 하는 것에 실질적인 차이가 있습니까?

delete a.x;

a.x = undefined;

어디에

a = {
    x: 'boo'
};

그들이 동등하다고 말할 수 있습니까?

("V8은 더 잘 사용하지 않는 것을 좋아합니다."와 같은 것은 고려하지 않습니다.)

그들은 동등하지 않습니다.주요 차이점은 설정이

a.x = undefined

는 것을 의미합니다.a.hasOwnProperty("x")여전히 진실로 돌아올 것이고, 따라서, 그것은 여전히 여전히 나타날 것입니다.for in 프루에서 그고리Object.keys()에.반면에.

delete a.x

는 것을 의미합니다.a.hasOwnProperty("x")합니다.

테스트를 통해 속성이 있는지 여부를 확인할 수 없습니다.

if (a.x === undefined)

속성이 존재하는지 확인하려면 항상 다음을 사용해야 합니다.

// If you want inherited properties
if ('x' in a)

// If you don't want inherited properties
if (a.hasOwnProperty('x'))

프로토타입 체인(zzzBov에서 언급)을 따라 부르기delete체인을 수 , 되지 않은 하면 체인된 수 없습니다.

var obj = {
  x: "fromPrototype"
};
var extended = Object.create(obj);
extended.x = "overriding";
console.log(extended.x); // overriding
extended.x = undefined;
console.log(extended.x); // undefined
delete extended.x;
console.log(extended.x); // fromPrototype

상속된 속성 삭제 삭제하려는 속성이 상속된 경우delete영향을 미치지 않을 것입니다. 그은것,delete상속된 속성이 아니라 개체 자체에서 속성만 삭제합니다.

var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype

할에는 다음과 같이 정의됩니다.delete. 설정(설정). 속성을 다음으로 설정(수정)해야 합니다.undefined확인하는 장소에서 하지 않는hasOwnProperty하지만 그것을 확인하는 모든 곳에서 사용될 것이라고 가정하는 것은 안전하지 않을 것입니다.hasOwnProperty

질문을 바꿔 말하면 다음과 같습니다.

delete a.x그리고.a.x = undefined동등한 것?

아니요.

전자는 변수에서 키를 제거하고, 후자는 키를 다음 값으로 설정합니다.undefined객체의 와 객체의 속성을 반복할 때 .hasOwnProperty사용됩니다.

a = {
    x: true
};
a.x = undefined;
a.hasOwnProperty('x'); //true
delete a.x;
a.hasOwnProperty('x'); //false

또한 프로토타입 체인이 포함될 경우 상당한 차이가 발생합니다.

function Foo() {
    this.x = 'instance';
}
Foo.prototype = {
    x: 'prototype'
};
a = new Foo();
console.log(a.x); //'instance'

a.x = undefined;
console.log(a.x); //undefined

delete a.x;
console.log(a.x); //'prototype'

한다면a.x함수인 세터함니다입수입니다.a.x = undefined에 함를호출반면에는하수는 함수를 호출합니다.delete a.x함수를 호출하지 않습니다.

네, 차이가 있습니다.사용하는 경우delete a.x더 x 더 의 이 a 이 아 니 지 만 속 성 면 다 사 한 용 이 당 신 만 약 는 상 다 면 ▁the ▁x 한 사 용 , 만 ▁you , 지 ▁isn ▁of ▁but ▁use ' ▁if ▁xa.x=undefined속성이지만 값이 정의되지 않았습니다.

이름이 좀 헷갈리네요.a.x = undefined을 을성다음설정니다합로으속으로 합니다.undefined하지만 재산은 여전히 거기에 있습니다.

> var a = {x: 3};
> a.x = undefined;
> a.constructor.keys(a)
["x"]

delete실제로 삭제:

> var a = {x: 3};
> delete a.x;
> a.constructor.keys(a)
[]

개체 대신 어레이를 사용하여 삭제가 정의되지 않은 것보다 힙 메모리를 덜 사용한다는 것을 보여줄 수 있습니다.

예를 들어, 이 코드는 완료되지 않습니다.

let y = 1;
let ary = [];
console.log("Fatal Error Coming Soon");
while (y < 4294967295)
{
    ary.push(y);
    ary[y] = undefined;
    y += 1;
}
console(ary.length);

다음 오류가 발생합니다.

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory.

처럼.undefined실제로 힙 메모리를 차지합니다.

만약 이 또한 만지당, 신도약만.delete이 아니라 arry-itemundefined 끝날 입니다:), 코는천종료됩니다천히드다.

let x = 1;
let ary = [];
console.log("This will take a while, but it will eventually finish successfully.");
while (x < 4294967295)
{
    ary.push(x);
    ary[x] = undefined;
    delete ary[x];
    x += 1;
}
console.log(`Success, array-length: ${ary.length}.`);

이것들은 극단적인 예들이지만, 그들은 요점을 만듭니다.delete아무도 언급한 적이 없다는 것을 알게 되었습니다.

노드로부터의 이 REPL은 차이점을 설명해야 합니다.

> a={ x: 'foo' };
{ x: 'foo' }
> for (var i in a) { console.log(i); };
x
undefined
> a.x=undefined;
undefined
> for (var i in a) { console.log(i); };
x
undefined
> delete a.x;
true
> for (var i in a) { console.log(i); };
undefined

사이의 차이점을 알 수 있을 것입니다.var o1 = {p:undefined};그리고.var o2 = {};.

모두, 두경우모두,,o.p▁▁be 될 것입니다.undefined하지만 첫 번째 경우에는 그것이 가치이기 때문이고 두 번째 경우에는 가치가 없기 때문입니다.

delete는 에서얻수있연니다입산자는에서 얻을 수 입니다.o1)p에서 (재산)까지o2그런 식으로:delete o1.p;.

값을 .undefined일 수 ) 합니다.o1.p = undefined;.

그래서 아니요, 그들은 동등하지 않습니다.


delete o.p;할 것이다

  • 재을처니다를 합니다.p에 의 개체가 로부터.

  • 달리 할 일이 없습니다

o.p = undefined;할 것이다

  • 재을추다를 합니다.p개체에 아직 개체가 없고 값을 다음으로 설정합니다.undefined

  • 개체에 이미 속성 값이 있는 경우 속성 값을 변경합니다.


에서 보면, 성측면서보면에능,보면▁from측서ance면에.delete생성자에서 초기화하지 않은 경우 새 속성을 추가하는 것과 마찬가지로 개체의 구조를 수정하기 때문에 좋지 않습니다.

을 값을 다음 설로 동는안 하정으로 .undefined내용도 릴리스하지만 구조를 강제로 수정하지는 않습니다.

개체는 단순히 트리 표현입니다. 즉, 메모리에서 루트는 해당 개체의 키가 저장된 다양한 메모리 위치를 가리킵니다.이 위치는 해당 키의 실제 값이 저장된 다른 위치, 하위 키가 저장된 위치 또는 배열 값이 저장된 위치를 가리킵니다.

delete를 사용하여 개체에서 키를 삭제하면 실제로 해당 키와 상위 개체 간의 링크가 삭제되고 키의 메모리 위치와 값이 다른 정보를 저장하기 위해 확보됩니다.

정의되지 않은 키를 값으로 설정하여 키를 삭제하려고 하면 해당 키를 삭제하는 것이 아니라 값을 설정하는 것입니다.즉, 키 메모리 위치가 상위 개체 및 키가 정의되지 않은 경우 값과 계속 연결됩니다.

delete 키워드를 사용하는 대신 정의되지 않은 키워드를 사용하는 것은 해당 키의 메모리 위치를 해제하지 않기 때문에 좋지 않습니다.

되지 않은는 값 " 존 하 지 않 정 되 지 설 경 도 해 에 생 키 됩 니 성 로 다 값 으 는 당 우 한 정 키 않 로 은 의 고 ▁will ▁is ▁with 니 ▁even 됩 ▁value 다undefined.

예.

var a = {};
a.d = undefined;
console.log(a); // this will print { d: undefined }

상속된 속성은 해당 하위 개체의 일부가 아니므로 해당 속성을 사용하여 삭제할 수 없습니다.

언급URL : https://stackoverflow.com/questions/14967535/delete-a-x-vs-a-x-undefined

반응형