이들 중 하나를 수행하는 데 실질적인 차이가 있습니까?
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.x
setter 함수 인 경우 함수 a.x = undefined
를 호출하지만 함수는 호출 delete a.x
하지 않습니다.
답변
예, 차이가 있습니다. delete a.x
x 를 사용 하면 더 이상 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
내용도 해제되지만 구조를 강제로 수정하지는 않습니다.