ES3에서는 다음과 같이 삭제가 8.6.2.5 및 11.4.1에 도입되었습니다.
정보가 좀 있는데,
1. 구현의 삭제 연산자는 엔진 내부의 [[Delete]] 메서드를 호출합니다.
2. [[삭제]]는 8.6.2에 정의되어 있습니다.
3. 삭제된 속성에는 DontDelete 기능이 있으므로 삭제 시 바로 false를 반환합니다.
"DontDelete"를 검색하면 다음 중 삭제할 수 없는 항목이 많이 있습니다.
1. 객체의 인수 객체를 활성화합니다(10.1.6).
다음과 같이 코드 코드를 복사합니다.
함수 함수() {
인수 삭제;
경고(인수);
}
기능(1);
2. 변수 선언(10.2.1)
다음과 같이 코드 코드를 복사합니다.
var a = 10;
삭제하다;
경고(a); // 10
이 항목은 JS 서적에서 많이 언급되는 항목입니다. 즉, var를 사용하여 선언한 변수는 삭제할 수 없습니다.
3. 함수 선언
다음과 같이 코드 코드를 복사합니다.
함수 함수() {}
기능 삭제;
Alert(func); //펑크 코드
4. 함수의 길이 속성
다음과 같이 코드 코드를 복사합니다.
함수 함수(a, b) {}
func.length 삭제;
경고(func.length); // 2
5. 일부 상수(NaN, Infinity, 정의되지 않음)
다음과 같이 코드 코드를 복사합니다.
NaN 삭제 // 거짓
무한대 삭제 // 거짓
정의되지 않은 삭제 // 거짓
6. 내장 생성자의 프로토타입
다음과 같이 코드 코드를 복사합니다.
Object.prototype 삭제 // 거짓
Function.prototype 삭제 // 거짓
Array.prototype 삭제 // 거짓
ExpReg.prototype 삭제 // 거짓
Date.prototype 삭제 // 거짓
Error.prototype 삭제 // 거짓
Number.prototype 삭제 // 거짓
Boolean.prototype 삭제 // 거짓
String.prototype 삭제 // 거짓
7. 배열과 문자열의 길이
다음과 같이 코드 코드를 복사합니다.
var arr = [], str = '안녕하세요';
arr.length 삭제 // 거짓
str.length 삭제 // 거짓
8. Math 객체의 속성 (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
다음과 같이 코드 코드를 복사합니다.
Math.E 삭제 // 거짓
...
9. 일반 객체의 속성(source, global,ignoreCase, multiline, lastIndex)
다음과 같이 코드 코드를 복사합니다.
var reg = /ss/;
reg.source 삭제 // 거짓
...
ES5는 ES3와 다릅니다. ES5에는 "DontDelete"가 없지만 [[Configurable]](8.6.1)이 추가되었습니다.
값이 false이면 삭제할 수 없습니다. 위에 나열된 9개 지점은 ES5에서 [[Configurable]]이 false로 설명됩니다.
ES5의 새로운 Object.defineProperty 메소드는 정의된 객체의 Configurable을 다음과 같이 표시할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
var obj = {이름: '존'};
Object.defineProperty(obj, "키", {
구성 가능: 거짓,
값: "정적"
});
obj.name 삭제; // 참
obj.key 삭제 // 거짓
객체 obj에는 이름과 키가 있습니다. 이름은 삭제할 수 있지만 키는 삭제할 수 없습니다.
또한 ES5 엄격 모드에서는 구성 가능 항목이 false인 객체를 삭제할 때 직접 예외가 발생합니다. 좋다
다음과 같이 코드 코드를 복사합니다.
"엄격하게 사용하세요";
Object.prototype 삭제;
FF의 콘솔 오류는 다음과 같습니다.
삭제할 수 없는 내장 개체의 일부 메서드나 속성 외에도 삭제할 수 없는 사용자 지정 개체도 있습니다. 예를 들어, 프로토타입에서 속성을 상속하는 객체는 삭제할 수 없습니다.
다음과 같이 코드 코드를 복사합니다.
함수 사람() {}
Person.prototype.name = '존 배커스';
var p = 새로운 사람();
p.name 삭제;
console.log(p.name); // 여전히 출력 John Backus
이 프로토타입에 이름이 있으면 삭제 후 프로토타입이 표시됩니다.
다음과 같이 코드 코드를 복사합니다.
함수 사람() {
this.name = '존 배커스';
}
Person.prototype.name = '존 레시그';
var p = 새로운 사람();
console.log(p.name); // 존 배커스
p.name 삭제;
console.log(p.name); // 프로토타입의 John Resig
프로토타입에서 이름을 삭제해야 하는 경우
다음과 같이 코드 코드를 복사합니다.
Person.prototype.name 삭제
요약하자면:
1. 내장 객체의 대부분의 속성과 메소드는 삭제할 수 없습니다. (isNaN 및 parsInt와 같은 일부는 삭제할 수 있지만)
2. 객체가 프로토타입에서 상속한 속성과 메서드는 삭제할 수 없습니다.
이유도 아주 간단해요.
1. 내장 객체의 대부분의 속성과 메소드는 언어의 핵심 API를 보호하기 위해 삭제할 수 없습니다. 이러한 API는 일단 삭제되면 기본적으로 쓸모가 없습니다. 예를 들어 Object.prototype을 삭제합니다.
2. 객체가 프로토타입에서 상속한 속성과 메서드는 프로토타입을 보호하기 위해 삭제할 수 없습니다. 그렇지 않으면 "클래스 A의 객체가 프로토타입의 속성을 삭제하면 A에서 상속된 모든 객체가 속성을 잃게 됩니다."