1. 변수
JavaScript의 삭제 연산자와 관련하여 먼저 JavaScript의 변수와 속성 간의 관계를 파악해야합니다.
JavaScript에서는 변수와 객체 속성의 관계가 매우 미묘하며 브라우저의 창 객체 인 스크립트를 실행하기 전에 JavaScript가 전역 객체를 생성하기 때문에 여러 번 동일시 할 수 있습니다. 모든 글로벌 변수는이 글로벌 객체의 속성입니다. 함수를 실행할 때 활성화 객체도 생성됩니다. 모든 로컬 변수는이 활성화 객체의 속성입니다. 이 JavaScripe 범위와 클로저에 대해 배울 수 있습니다.
코드 사본은 다음과 같습니다.
// 프로토 타입에서 선언 된 속성을 삭제할 수 없습니다
var global = 1;
this.global; // 1,이를 통해 글로벌 객체에 액세스 할 수 있습니다
this.global2 = 2;
글로벌 2; // 12
함수 foo () {
var local = 36;
// 그러나 활성화에 직접 액세스 할 수 없습니다.
// 따라서 foo.local을 통해 로컬 변수에 액세스 할 수 없습니다
}
변수는 객체 속성과 동일하지만 실제로는 삭제 연산자와 동일하지 않습니다. 내 이해는 변수 선언이 VAR 문을 통해 완료되어야한다는 것입니다. VAR 문을 통해 선언되지 않은 글로벌 변수는 모두 창 객체의 속성입니다. 이를 통해 변수와 객체 속성의 관계를 쉽게 이해할 수 있습니다.
2. 연산자 삭제
삭제 연산자는 객체 속성을 삭제하는 데 사용됩니다. 참조 유형 값의 경우 객체 속성 자체를 삭제하고 속성이 가리키는 객체를 삭제하지 않습니다. 질문이 있으시면 기본 유형 및 참조 유형의 값을 살펴 보거나 다음 코드를 테스트 할 수 있습니다.
코드 사본은 다음과 같습니다.
var o = {};
var a = {x : 10};
OA = A;
OA 삭제; // OA 속성이 삭제됩니다
Console.log (OA); // 한정되지 않은
Console.log (AX); // 10, {x : 10} 객체는 여전히 A로 참조되므로 재활용되지 않습니다.
또한 삭제 OX는 DELETE O [ "X"]로 작성할 수도 있으며 두 가지 효과는 동일합니다.
3. 변수는 삭제할 수 없습니다
VAR에 의해 선언 된 변수 및 기능으로 선언 한 함수는 dontDelete 기능을 가지며 삭제할 수 없습니다. VAR (Global Objects의 속성)을 통해 선언되지 않은 글로벌 변수
코드 사본은 다음과 같습니다.
var global = {
A : 123,
B : {
C : 1345
}
};
글로벌 삭제; //유효하지 않은
Console.log (글로벌)
obj = {
A : 123
};
obj 삭제; // obj global 변수, window 객체의 OBJ 속성 삭제
console.log (obj); // obj는 정의되지 않았습니다
4. 프로토 타입에 선언 된 속성과 객체와 함께 제공되는 속성을 삭제할 수 없습니다.
프로토 타입 프로토 타입에 선언 된 속성과 객체와 함께 제공되는 속성 (실제로 이러한 속성은 프로토 타입 프로토 타입에도 있음)은 DontDelete의 특성을 갖는 것으로 간주 될 수 있으며 삭제할 수 없습니다. 예를 들어
코드 사본은 다음과 같습니다.
// 프로토 타입에서 선언 된 속성을 삭제할 수 없습니다
함수 obj () {
this.x = 1;
}
obj.prototype.x = 2;
var o = 새로운 obj ();
Console.log (ox); // 1, 생성자에 정의 된 OX
황소 삭제;
Console.log (ox); // 2, 프로토 타입에 정의 된 황소는 삭제 황소가 다시 실행 되더라도 삭제되지 않습니다.
// 객체와 함께 제공되는 속성은 삭제할 수 없습니다.
var strings = "123456";
Console.log (strings.length); // 6
줄을 삭제합니다. 길이;
console.log (strings.length); // 여전히 6입니다
5. 평가 명세서에 따른 몇 가지 예외
Eval에 의해 실행 된 코드에서 Var로 선언 된 변수는 일반 객체에 정상 var 선언 변수로 속해 있지만 dontdelete 속성이 없으며 삭제할 수 있습니다. 그러나 VAR에 의해 정의 된 변수는 Eval Code의 함수에서 정의 된 변수는 DontDelete이며 삭제할 수 없습니다.
코드 사본은 다음과 같습니다. Eval ( "var x = 42;");
엑스; // => 42
x 삭제;
엑스; // => referenceError : x는 정의되지 않았습니다
평가 ( "함수 f () {return 12;}");
에프(); // => 12
f 삭제 f;
에프(); // => referenceError : F는 정의되지 않았습니다
// var에 의해 선언 된 변수는 정상 var 선언 변수로 전역 객체에 속하지만 Eval에 의해 실행 된 코드에서
// 그러나 그들은 dontdelete 기능이 없으며 삭제할 수 있습니다.
평가 ( "(function () {" +
"var x = 42;" +
"x 삭제;" +
"반환 x;" +
"}) ();")
// => 42
// vAR에 의해 정의 된 변수 Eval Code의 함수에서 정의 된 변수는 DontDelete이며 삭제할 수 없습니다.
6. 삭제의 반환 값
Delete는 일반 연산자이며 True 또는 False를 반환합니다. 삭제 된 객체의 속성이 존재하고 Dondelete가 있으면 false를 반환하십시오. 여기서 한 가지 특징은 객체 속성이 존재하지 않으면 TRUE를 반환하므로 반환 값이 삭제가 성공 여부와 정확히 동일하지 않다는 것입니다.
코드 사본은 다음과 같습니다.
함수 c () {
this.x = 42;
}
C. prototype.y = 12;
var o = 새로운 c ();
황소 삭제; // 진실
황소; // 한정되지 않은
"X"O의 "X"; // 거짓
// 황소가 존재하고 dontdelete가없고, 진실을 반환합니다.
Oy 삭제; // 진실
오이; // 12
// O 자체는 OY 속성이 없으므로 true를 반환합니다.
// 여기에서 프로토 타입 체인의 존재를 볼 수 있습니다. 객체 자체의 속성 및 프로토 타입 속성은 다릅니다.
삭제 o; // 거짓
// global.o에는 dontdelete 기능이 있으므로 False를 반환합니다
undefinedproperty를 삭제합니다. // 진실
// Global은 undefinedProperty라는 속성이 없으므로 True를 반환합니다.
삭제 42; // 진실
// 42는 속성이 아니므로 TRUE를 반환합니다. 일부 구현에는 예외가 발생합니다 (ECMAScript 표준 위반)
var x = 24;
x ++ 삭제; // 진실
엑스; // 25
// 삭제되는 것은 속성이 아닌 x ++ (24)의 반환 값이므로 true를 반환합니다.