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