[javascript] 도끼 삭제 vs 도끼 = 정의되지 않음

이들 중 하나를 수행하는 데 실질적인 차이가 있습니까?

delete a.x;

vs

a.x = undefined;

어디

a = {
    x: 'boo'
};

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

(나는 “V8은 delete더 잘 사용하지 않는 것을 좋아한다” 와 같은 것을 고려하지 않고있다 )



답변

그것들은 동등하지 않습니다. 가장 큰 차이점은

a.x = undefined

a.hasOwnProperty("x"), 여전히 true를 반환하므로 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'))

프로토 타입 체인 ( zzzzBov에 의해 언급 )에 따라 호출 delete하면 프로토 타입 체인으로 올라갈 수 있지만, 값을 undefined로 설정하면 체인 된 프로토 타입에서 속성을 찾지 않습니다 http://jsfiddle.net/NEEw4/1/

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.xa.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.xsetter 함수 인 경우 함수 a.x = undefined를 호출하지만 함수는 호출 delete a.x하지 않습니다.


답변

예, 차이가 있습니다. delete a.xx 를 사용 하면 더 이상 a의 속성이 아니지만 사용 a.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)
[]


답변

이 REPL from node는 차이점을 설명해야합니다.

> 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될 것입니다 undefined하지만이 때문에 첫 번째 경우에, 그것의 과 두 번째 경우에 때문에 값이없는 .

delete당신이에서 얻을 할 수있는 연산자 o1(또는 할당 된 값이 다른 객체 p속성)에 o2그 방법은 : delete o1.p;.

역동 작은 단순히 undefined속성에 값을 할당함으로써 이루어집니다 ( 이 예제에서는 다른 것일 수도 있습니다) o1.p = undefined;.

따라서 no 는 동일하지 않습니다.


delete o.p; 의지

  • 속성 p이있는 경우 개체 에서 속성 을 제거하십시오.

  • 달리 아무것도 하지마

o.p = undefined; 의지

  • p아직 속성 이 없으면 객체에 속성 을 추가 하고 값을undefined

  • 객체에 이미있는 경우 속성 값을 변경하기 만하면됩니다.


성능 관점에서 delete입니다 나쁜 것이 있기 때문에 객체의 구조를 변경 (당신이 생성자에서 초기화하지 않은 경우 새 속성을 추가하는 등).

값을 설정하면 undefined내용도 해제되지만 구조를 강제로 수정하지는 않습니다.