이들 중 하나를 수행하는 데 실질적인 차이가 있습니까?
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.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.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내용도 해제되지만 구조를 강제로 수정하지는 않습니다.
