오늘 프로토타입 코드를 보다가 삭제 연산자
unset: function(key) {
var value = this._object[key];
delete this._object[key];
반환 값; >
매뉴얼을 확인해 보니
삭제 연산자
가 객체에서 속성을 삭제하거나 배열에서 요소를 삭제하는 것으로 나타났습니다.
식 삭제
식 매개 변수는 유효한 JScript 식이며 일반적으로 속성 이름 또는 배열 요소입니다.
설명
expression의 결과가 객체이고 표현식에 지정된 속성이 존재하고 객체가 삭제를 허용하지 않는 경우 false를 반환합니다.
다른 모든 경우에는 true를 반환합니다.
"배열에서 요소 삭제"를 보면 기분이 좋은데, ff에서 시도해 보니 요소 자체가 아닌 해당 요소의 값만 삭제할 수 있는 것 같습니다. 그러나 객체에서 속성을 삭제할 수는 있습니다.
코드 복사
function foo() {
var local = 36 ;
// 단, Activation에는 직접 접근할 수 없습니다.
// 따라서 foo.local을 통해 로컬 변수에 접근할 수 없습니다.
}
삭제 연산자로 삭제한 객체
는 C에도 있습니다. 삭제 연산자는 포인터가 가리키는 객체를 삭제합니다. 예:
코드 복사
}
Object o;
o.x = new Object()
delete o.x; line이 해제됩니다
그런데 Javascript의 삭제는 C와 다릅니다. o.x가 가리키는 객체를 삭제하는 것이 아니라 o.x 속성 자체를 삭제합니다.
코드 복사
o.x; // 정의되지 않음, o의 속성이 삭제됨
실제 Javascript에서는 o.x를 삭제한 후 참조 손실로 인해 Object 개체가 가비지 수집되므로 o.x를 삭제하는 것은 o.x가 가리키는 개체를 삭제하는 것과 "동등"하지만 이 작업은 ECMAScript가 아닙니다. 즉, 구현이 Object 객체를 전혀 삭제하지 않더라도 ECMAScript 표준을 위반하지 않습니다.
"객체 삭제가 아닌 속성 삭제"는 다음 코드로 확인할 수 있습니다.
코드 복사
o.a; // 정의되지 않음
a.x; : 10 } 객체 남아 a로 참조되므로 재활용되지 않습니다
또한 delete o.x는 delete o["x"]로 쓸 수도 있으며 둘 다 동일합니다. 효과.
변수에 대한 삭제 실행 상황
변수도 Global 또는 Activation 개체의 속성이므로 해당 변수에 대한 삭제 작업도 결과는 동일합니다.
코드 복사
속성 삭제 삭제할 수 있는 속성과 삭제할 수 없는 속성
모든 속성을 삭제할 수 있는 것은 아닙니다. 예를 들어 프로토타입에 선언된 속성은 삭제할 수 없습니다.
코드 복사
코드는 다음과 같습니다.
function C() { this.x = 42; }
C.prototype.x = 12;
var o = new C()
o.x; 함수에 정의된 o.x
delete o.x;
o.x; // 12, 프로토타입에 정의된 o.x는 delete o.x를 다시 실행해도 삭제되지 않습니다.
객체의 사전 정의된 속성 삭제할 수도 없습니다. 이러한 유형의 속성은 DontDelete의 특성을 갖고 있다고 볼 수 있습니다.
var re = /abc/i
delete re.ignoreCase;
re.ignoreCase; // true,ignoreCase는 삭제할 수 없습니다.
삭제 가능한 변수와 삭제할 수 없는 변수
var 및 함수를 통해 선언된 변수 함수를 통해 선언한 DontDelete 속성을 가지고 있어 삭제할 수 없습니다.
var x = 36>delete; x;
x; // 36, x는 삭제되지 않음
delete y
y // 정의되지 않음
return 42; >delete foo ;
foo(); // 42
하지만 eval을 통해 실행되는 코드에는 예외가 있습니다. 단, var를 통해 선언된 변수는 동일한 전역 변수에 속합니다. 객체는 일반 var 선언 변수로 사용되지만 DontDelete 속성이 없으므로 삭제할 수 있습니다.
x; // 42
delete x;
x; // undefine
하지만 평가 코드 내에서 var로 정의된 변수가 하나 있습니다. DontDelete 가 있으므로 삭제할 수 없습니다.
코드 복사
코드는 다음과 같습니다.eval("(function() { var x = 42 삭제 규칙은 삭제된 개체의 속성이 존재하고 DontDelete가 있으면 false를 반환하고 그렇지 않으면 true를 반환하는 것입니다. 여기서 한 가지 특징은 객체 속성이 존재하지 않는 경우에도 true를 반환하므로 반환 값이 삭제 성공 여부와 완전히 동일하지는 않습니다.
코드 복사
코드는 다음과 같습니다.
delete o.y; // true
o.y; // 12
// o 자체에는 o.y 속성이 없으므로 true를 반환합니다.
// 여기서도 프로토타입 체인의 존재를 확인할 수 있습니다. 객체 자체 속성과 프로토타입 속성이 다릅니다.
delete o; // false
// Global.o에는 DontDelete 기능이 있습니다. false를 반환합니다.
delete unundefinedProperty; / / true
// 전역에는 undefineProperty라는 속성이 없으므로 true를 반환합니다.
delete 42; // true
// 42는 속성이 아니므로 true를 반환합니다. 일부 구현에서는 예외가 발생합니다(ECMAScript 표준 위반)
var x = 24;
delete x; // true
x; // 25
// 삭제되는 것은 x의 반환 값입니다. 24)은 속성이 아니므로 true를 반환합니다