>  기사  >  웹 프론트엔드  >  JavaScript_javascript 팁에서 삭제 연산자로 삭제할 수 없는 객체 구문 분석

JavaScript_javascript 팁에서 삭제 연산자로 삭제할 수 없는 객체 구문 분석

WBOY
WBOY원래의
2016-05-16 17:10:561302검색

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 Object.prototype; // false
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)



코드 복사
코드는 다음과 같습니다. delete Math.E; // false ...

9, 일반 객체의 속성(source, global,ignoreCase, multiline, lastIndex)



코드 복사
코드는 다음과 같습니다. 다음:var reg = /ss/; reg. 소스 삭제 // false
...


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에서 상속된 모든 객체가 속성을 잃게 됩니다. ."

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.