오늘 프로토타입 코드를 보다가 삭제 연산자를 발견했습니다.
설정되지 않음: 함수(키) {
var 값 = this._object[키];
this._object[키]를 삭제하세요.
반환값;
}
설명서를 확인해 보니,
삭제 연산자는 객체에서 속성을 삭제하거나 배열에서 요소를 삭제합니다.
표현 삭제
표현식 매개변수는 유효한 JScript 표현식이며 일반적으로 속성 이름 또는 배열 요소입니다.
설명 표현식의 결과가 객체이고 표현식에 지정된 속성이 존재하며 객체가 삭제를 허용하지 않는 경우 false를 반환합니다.
다른 모든 경우에는 true를 반환합니다.
"배열에서 요소를 삭제한다"는 걸 보면 기분이 좋은데, ff에서 시도해 보니 요소 자체가 아닌 해당 요소의 값만 삭제할 수 있는 것 같습니다. 그러나 객체에서 속성을 삭제할 수는 있습니다.
다시 구글링을 하다가 매우 자세하게 설명된 기사를 찾았으므로 잊지 않도록 여기에 다시 게시하겠습니다.
제목: Javascript 변수 및 삭제 연산자 저작권 설명: 마음대로 재인쇄할 수 있지만 원저자 charlee와 원본 링크 http://tech.idv2.com/2008/01/09/javascript-variables-and- 를 표시해야 합니다. -operator/ 및 이 명령문을 다시 인쇄할 때 삭제하세요 .
콘텐츠:
방금 Javascript의 삭제 연산자에 대한 철저한 분석을 제공하는 좋은 기사(원본 링크)를 읽었습니다. 내용에 대한 간략한 소개는 다음과 같습니다.
작은 삭제 연산자이기는 하지만 그 동작은 매우 복잡합니다.
자바스크립트 변수
삭제 연산자에 의해 삭제된 객체 변수에 대해 삭제가 실행된 경우 삭제할 수 있는 속성과 삭제할 수 없는 속성, 삭제할 수 있는 변수, 삭제할 수 없는 변수
삭제 반환값
--------------------------------- --- ---------------------
자바스크립트 변수 사실 자바스크립트에서는 변수=객체속성, 이는 Javascript가 스크립트를 실행하기 전에 전역 개체를 생성하기 때문입니다. 함수를 실행하면 활성화 개체도 모두 이 활성화 개체의 속성으로 생성됩니다. 예:
var global = 42;this.global; // 42, this.global2 = 12;global2; // 12function foo() { var local = 36; be access direct , //따라서 foo.local을 통해서는 지역 변수에 접근할 수 없습니다} delete 연산자에 의해 삭제된 객체
C++에는 포인터가 가리키는 객체를 삭제하는 삭제 연산자도 있습니다. 예:
// C++class Object {public: Object *x;}Object o;ox = new Object();delete ox; // 이전 줄의 새 Object 객체가 해제되지만 Javascript의 삭제는 다릅니다. C++에서 ox가 가리키는 객체는 삭제되지 않지만 ox 속성 자체는 삭제됩니다.
// Javascriptvar o = {};ox = new Object();delete ox; // 이전 줄의 new 객체가 여전히 존재합니다. // 정의되지 않은 경우, 실제 Javascript에서는 x라는 속성이 삭제됩니다. ox를 삭제한 후에는 참조가 손실되어 Object 객체가 가비지 수집됩니다. 따라서 ox를 삭제하는 것은 ox가 가리키는 객체를 삭제하는 것과 "동등합니다". 즉, 이 작업은 ECMAScript 표준이 아닙니다. 구현이 완전히 완료되더라도 Object 객체를 삭제하지 않는 것은 ECMAScript 표준을 위반하지 않습니다.
"객체를 삭제하는 대신 속성을 삭제하는 것"은 다음 코드로 확인할 수 있습니다.
var o = {};var a = { x: 10 };oa = a;delete oa; // oa 속성이 삭제되었습니다. oa; // undefinea.x; 여전히 참조이므로 재활용되지 않습니다. 또한 delete ox는 delete o["x"]로 작성할 수도 있으며 둘 다 동일한 효과를 갖습니다.
변수를 삭제할 때 변수는 전역 또는 활성화 개체의 속성이기도 하므로 변수에 대한 삭제 작업의 결과는 동일합니다.
var global = 42; delete global; // 삭제 Global.globalfunction foo() { var local = 36; delete local; // 삭제 가능한 속성과 삭제할 수 없는 속성 삭제. 예를 들어 프로토타입에 선언된 속성은 삭제할 수 없습니다.
function C() { this.x = 42; }C.prototype.x = 12;var o = new C();ox; // 42, 생성자 o에 정의됨 .xdelete ox;ox; // 12, 프로토타입에 정의된 ox는 delete ox를 다시 실행해도 삭제되지 않습니다. 이러한 유형의 속성은 DontDelete의 특성을 갖고 있다고 볼 수 있습니다.
var re = /abc/i;delete re.ignoreCase;re.ignoreCase; // true,ignoreCase는 삭제할 수 있는 변수와 삭제할 수 없는 변수를 삭제할 수 없습니다. var를 통해 선언된 변수와 function을 통해 선언된 함수에는 DontDelete 속성이 있으며, 삭제할 수 없습니다.
var x = 36;delete x;x; // 36, x는 삭제되지 않습니다. y = 12;delete y;y; // undefinefunction foo() { return 42; }delete foo;foo(); 한 가지 예외는 eval을 통해 실행된 코드에서 var를 통해 선언된 변수가 일반 var로 선언된 변수와 동일한 Global 개체에 속하더라도 DontDelete 속성이 없으므로 삭제할 수 있다는 것입니다.
eval("var x = 36;");x; // 42delete x;x; // 정의되지 않았지만 eval 코드의 함수에서 var로 정의된 변수에는 DontDelete가 있으므로 삭제할 수 없습니다. function() { var x = 42; delete x; return x; })();"); // 42delete의 반환 값을 반환합니다.
삭제는 일반 연산자이며 true 또는 false를 반환합니다. 규칙은 삭제된 개체의 속성이 존재하고 DontDelete가 있으면 false를 반환하고 그렇지 않으면 true를 반환하는 것입니다. 여기서 한 가지 특징은 객체 속성이 존재하지 않는 경우에도 true를 반환하므로 반환 값이 삭제 성공 여부와 완전히 동일하지는 않습니다.
function C() { this.x = 42; }C.prototype.y = 12;var o = new C();delete ox; // 정의되지 않은 "x" in o; / ox가 존재하고 DontDelete가 없으면 return truedelete oy; // trueo.y; // 12// o 자체에는 oy 속성이 없으므로 true를 반환합니다. // 여기에서 프로토타입 체인의 존재도 확인할 수 있습니다. 객체 자체의 속성과 프로토타입 속성이 다릅니다. delete o; // false// Global.o에는 DontDelete 속성이 있으므로 false를 반환합니다. / 42는 속성이 아니므로 true를 반환합니다. 일부 구현에서는 예외가 발생합니다(ECMAScript 표준 위반) var x = 24; delete x++; // truex; // 25// 삭제되는 것은 속성이 아닌 x++의 반환 값(24)이므로 true가 반환됩니다.