JavaScript delete 연산 자 응용 인 스 턴 스

오늘 prototype 코드 를 보 았 을 때 delete 라 는 연산 자

unset: function(key) {
var value = this._object[key];
delete this._object[key];
return value;
}
가 매 뉴 얼 을 찾 아 보 았 습 니 다.delete 연산 자 는 대상 에서 속성 을 삭제 하거나 배열 에서 요 소 를 삭제 합 니 다.delete expression 인 자 는 유효한 JScript 표현 식 으로 속성 명 이나 배열 요소 입 니 다.expression 의 결과 가 하나의 대상 이 고 expression 에서 지정 한 속성 이 존재 하 며 이 대상 이 삭제 되 는 것 을 허락 하지 않 으 면 false 로 돌아 간 다 는 것 을 설명 합 니 다.모든 다른 상황 에서 true 로 돌아 갑 니 다.'배열 에서 요 소 를 삭제 합 니 다'를 보 니 좋 은 것 같 습 니 다.그런데 ff 에서 해 보 니 요소 자체 가 아 닌 그 요소 의 값 만 삭제 할 수 있 을 것 같 습 니 다.대상 에서 속성 하 나 를 삭제 하 는 것 은 가능 합 니 다.또 구 글 은 자바 script 의 변 수 는 실제 자바 script 에서 변수=대상 속성 을 잊 지 않도록 상세 하 게 설명 한 글 이 있 습 니 다.이것 은 자바 script 이 스 크 립 트 를 실행 하기 전에 Global 대상 을 만 들 기 때 문 입 니 다.모든 전역 변 수 는 이 Global 대상 의 속성 이 고 함 수 를 실행 할 때 도 Activation 대상 을 만 들 기 때 문 입 니 다.모든 부분 변 수 는 이 Activation 대상 의 속성 입 니 다.다음 예:

var global = 42;
this.global; // 42, this Global
this.global2 = 12;
global2; // 12
function foo() {
var local = 36;
// Activation,
// foo.local local
}
delete 연산 자가 삭제 한 대상 C++에 도 delete 연산 자가 있 습 니 다.포인터 가 가리 키 는 대상 을 삭제 합 니 다.예 를 들 어

// C++
class Object {
public:
Object *x;
}
Object o;
o.x = new Object();
delete o.x; // new Object
그러나 Javascript 의 delete 는 C++와 달리 o.x 가 가리 키 는 대상 을 삭제 하지 않 고 o.x 속성 자 체 를 삭제 합 니 다.

// Javascript
var o = {};
o.x = new Object();
delete o.x; // new Object
o.x; // undefined,o x
실제 자 바스 크 립 트 에 서 는 delete o.x 이후 오 브 젝 트 대상 이 인용 을 잃 어 쓰레기 수 거 되 기 때문에 delete o.x 는 o.x 가 가리 키 는 대상 을'삭제 한 것'에 해당 하지만,이 동작 은 ECMAScript 기준 이 아니 며,어떤 실현 이 오 브 젝 트 대상 을 전혀 삭제 하지 않 더 라 도 ECMAScript 기준 을 위반 한 것 은 아니 라 는 것 이다."삭제 대상 이 아 닌 속성 을 삭제 한 다 는 점 은 다음 코드 를 통 해 확인 할 수 있 습 니 다.

var o = {};
var a = { x: 10 };
o.a = a;
delete o.a; // o.a
o.a; // undefined
a.x; // 10, { x: 10 } a ,
또한 delete o.x 도 delete o[x]를 쓸 수 있 고 이들 의 효 과 는 같다.변수 에 delete 를 실행 하 는 경우 변수 도 Global 또는 Activation 대상 의 속성 이기 때문에 변수 에 대한 delete 작업 도 같은 결과 입 니 다.

var global = 42;
delete global; // Global.global
function foo() {
var local = 36;
delete local; // Activation.local
}
삭제 할 수 있 는 속성 과 삭제 할 수 없 는 속성 은 모든 속성 이 delete 되 는 것 이 아니다.예 를 들 어 prototype 에서 설명 한 속성 은 delete:

function C() { this.x = 42; }
C.prototype.x = 12;
var o = new C();
o.x; // 42, o.x
delete o.x;
o.x; // 12, prototype o.x, delete o.x
대상 의 미리 정 의 된 속성 도 삭제 할 수 없습니다.이러한 속성 은 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; // undefined
function foo() { return 42; }
delete foo;
foo(); // 42
그러나 한 가지 예 외 는 eval 을 통 해 실 행 된 코드 에서 var 를 통 해 발 표 된 변 수 는 정상 적 인 var 성명 변수 와 같은 Global 대상 에 속 하지만 DontDelete 특성 을 가지 지 않 아 삭 제 될 수 있다 는 것 이다.

eval("var x = 36;");
x; // 42
delete x;
x; // undefined
그러나 이것 도 예외 가 있 습 니 다.eval 코드 의 함수 에서 var 를 통 해 정 의 된 변 수 는 DontDelete 가 있어 서 삭제 할 수 없습니다.

eval("(function() { var x = 42; delete x; return x; })();");
// 42
delete 의 반환 값 delete 는 일반 연산 자 이 며 true 나 false 로 돌아 갑 니 다.규칙:delete 대상 의 속성 이 존재 하고 DontDelete 가 있 을 때 false 로 돌아 갑 니 다.그렇지 않 으 면 true 로 돌아 갑 니 다.대상 속성 이 존재 하지 않 을 때 도 true 로 돌아 가 는 것 이 특징 입 니 다.따라서 반환 값 은 삭제 성공 여부 와 완전히 같 지 않 습 니 다.

function C() { this.x = 42; }
C.prototype.y = 12;
var o = new C();
delete o.x; // true
o.x; // undefined
"x" in o; // false
// o.x DontDelete, true
delete o.y; // true
o.y; // 12
// o o.y , true
// prototype , prototype
delete o; // false
// Global.o DontDelete false
delete undefinedProperty; // true
// Global undefinedProperty true
delete 42; // true
// 42 true。 ( ECMAScript )
var x = 24;
delete x++; // true
x; // 25
// x++ (24), , true

좋은 웹페이지 즐겨찾기