> 웹 프론트엔드 > JS 튜토리얼 > js의 삭제 연산자 및 내부 속성 인스턴스에 대한 자세한 설명

js의 삭제 연산자 및 내부 속성 인스턴스에 대한 자세한 설명

小云云
풀어 주다: 2018-03-31 17:20:13
원래의
2212명이 탐색했습니다.

이 기사에서는 주로 js의 삭제 연산자 및 내부 속성 인스턴스에 대한 자세한 설명을 공유합니다. Configurable을 설명하기 전에 먼저 인터뷰 질문을 살펴보겠습니다.

a = 1;console.log( window.a ); 
// 1console.log( delete window.a ); 
// trueconsole.log( window.a ); 
// undefinedvar b = 2;console.log( window.b ); 
// 2console.log( delete window.b ); 
// falseconsole.log( window.b ); // 2
로그인 후 복사

위 질문에서 두 가지의 차이점을 볼 수 있습니다. using var로 변수를 선언할 때 delete 키워드를 사용하여 삭제할 수 있으며, 다시 가져올 때 값은 정의되지 않습니다. var로 변수를 선언하면 delete로 삭제할 수 없으며 값은 그대로 유지됩니다. 다시 얻으면 여전히 2입니다.

1. 삭제 연산자

삭제를 사용하여 변수나 속성을 삭제할 때 삭제에 성공하면 true를 반환하고 그렇지 않으면 false를 반환합니다. 위의 예에서와 같이 삭제가 변수 a를 삭제할 수 없으면 false를 반환하고, 삭제가 변수 b를 성공적으로 삭제할 수 있으면 true를 반환합니다.

위의 두 가지 상황 외에도 삭제로 삭제할 수 있는 자주 사용되는 변수와 삭제할 수 없는 변수가 많이 있습니다. 이러한 변수를 삭제할 때 왜 그런 결과가 발생하는지 걱정하지 마세요. 여기서는 반환 값만 살펴보겠습니다.

삭제 배열의 요소 중 하나 삭제:

// 使用for~in是循环不到的,直接忽略到该元素
// 使用for()可以得到该元素,但是值是undefinedvar arr = [1, 2, 3, 4];console.log( arr );             
// [1, 2, 3, 4]console.log( delete arr[2] );   
// true,删除成功console.log( arr );             
// [1, 2, undefined, 4]
로그인 후 복사

함수 유형 변수 삭제:

// chrome 不能删除;火狐可以删除function func(){
}
console.log( func );console.log( delete func );
console.log( func );
로그인 후 복사

Delete 함수. length , 길이는 획득된 형식 매개변수의 수입니다:

function func1(a, b){
}console.log( func1.length );       
 // 2console.log( delete func1.length ); 
 // true,删除成功console.log( func1.length );       
  // 0
로그인 후 복사

공통 변수 삭제:

console.log( delete NaN );     
 // false,删除失败console.log( delete undefined );
 // falseconsole.log( delete Infinity ); 
 // falseconsole.log( delete null );     
 // true,删除成功
로그인 후 복사

프로토타입의 속성을 삭제하는 대신 프로토타입 삭제:

function Person(){
}
Person.prototype.name = "蚊子";console.log( delete Person.prototype );
 // false,无法删除console.log( delete Object.prototype ); 
 // false
로그인 후 복사

배열 및 문자열의 길이를 삭제할 때:

var arr = [1, 2, 3, 4];console.log( arr.length );          
// 4console.log( delete arr.length );   
// false,删除失败console.log( arr.length );          
// 4var str = 'abcdefg';console.log( str.length );         
 // 7console.log( delete str.length );   
 // false,删除失败console.log( str.length );         
  // 7
로그인 후 복사

Delete obj 삭제 시 속성:

var obj = {name:'wenzi', age:25};console.log( obj.name );       
 // wenziconsole.log( delete obj.name ); 
 // true,删除成功console.log( obj.name );        
 // undefinedconsole.log( obj );             
 // { age:25 }
로그인 후 복사

인스턴스 객체에서 속성을 삭제할 때 삭제를 사용하여 속성을 삭제하면 인스턴스 객체 자체의 속성만 삭제되고 프로토타입의 속성은 삭제할 수 없음을 다음 출력에서 ​​확인할 수 있습니다. 프로토타입에 있는 속성을 다시 삭제하더라도 한번 삭제해도 삭제되지 않으며, 프로토타입에 있는 속성이나 메소드를 삭제하려면 Person.prototype.name만 삭제하면 됩니다. :

function Person(){    this.name = 'wenzi';
}
Person.prototype.name = '蚊子';var student = new Person();console.log( student.name );        
// wenziconsole.log( delete student.name ); 
// true,删除成功console.log( student.name );        
// 蚊子console.log( delete student.name ); 
// trueconsole.log( student.name );       
 // 蚊子console.log( delete Person.prototype.name );
 // true,删除成功console.log( student.name );       
  // undefined
로그인 후 복사

2. js의 내부 속성

위의 예에서 일부 변수 또는 속성은 삭제할 수 있지만 일부 변수 또는 속성은 삭제할 수 없습니다. 따라서 이 변수 ​​또는 속성을 삭제할 수 있는지 여부는 어떻게 결정됩니까?

ECMA-262 5판은 JS 객체 속성(JS 엔진에서 사용되며 외부에서 직접 액세스할 수 없음)의 특성을 정의합니다. ECMAScript에는 데이터 속성과 접근자 속성이라는 두 가지 속성이 있습니다.

2.1 데이터 속성

데이터 속성은 값을 읽거나 쓸 수 있는 데이터 값이 포함된 위치를 나타냅니다. 이 속성은 해당 동작을 설명하는 4가지 특성을 갖습니다.

. 삭제 연산자를 사용하여 삭제하고 재정의할 수 있는지 또는 접근자 속성으로 수정할 수 있는지 여부입니다. 기본값은 true;
입니다. [[Enumberable]]: for-in 루프를 통해 속성을 반환할 수 있는지 여부를 나타냅니다. 기본값은 true;
. [[쓰기 가능]]: 속성 값을 수정할 수 있는지 여부를 나타냅니다. 기본값은 true;
. [[값]]: 이 속성의 데이터 값을 포함합니다. 이 값은 읽혀지고 쓰여집니다. 기본값은 정의되지 않았습니다. 예를 들어 name 속성은 위의 인스턴스 객체 Person에 정의되어 있으며 해당 값은 'wenzi'입니다. 이 값에 대한 수정은 모두 이 위치에서 수행됩니다.

객체 속성의 기본 특성을 수정하려면( 기본값은 true) Object.defineProperty() 메서드를 호출할 수 있습니다. 이 메서드는 세 가지 매개변수(속성이 있는 객체, 속성 이름 및 설명자 객체)를 받습니다(구성 가능, 번호 매기기 가능, 쓰기 가능 및 값이어야 함). 더 많은 값을 설정할 수 있습니다).

는 다음과 같습니다.

var person = {};Object.defineProperty(person, 'name', {
    configurable: false,    // 不可删除,且不能修改为访问器属性
    writable: false,        // 不可修改
    value: 'wenzi'          // name的值为wenzi});console.log( person.name);          // wenziconsole.log( delete person.name );  // false,无法删除person.name = 'lily';console.log( person.name );         // wenzi
로그인 후 복사

person.name의 값을 삭제하거나 재설정하지 않는 것을 볼 수 있습니다. 이는 DefineProperty 함수를 호출하면 개체 속성의 특성이 수정되기 때문입니다. 그런 다음 defineProperty를 사용하여 true로 수정합니다(실행 시 오류가 보고됩니다: Uncaught TypeError: Cannot redefine property: name);

2.2 접근자 속성

주로 한 쌍의 getter 및 setter 함수가 포함됩니다. 접근자 속성을 읽으면 getter를 호출하면 유효한 값이 반환됩니다. 접근자 속성을 작성할 때 setter를 호출하고 새 값을 작성하면 다음과 같은 4가지 특성이 있습니다. 삭제 연산자를 통해 삭제하고 재정의할 수 있습니다.

[[Get]]: 속성을 읽을 때 자동으로 호출됩니다.

. [[Set]]: 속성 작성 시 자동 호출 호출됨, 기본값: 정의되지 않음

접근자 속성은 직접 정의할 수 없으며 다음과 같이 DefineProperty()를 사용하여 정의해야 합니다.

var person = {
    _age: 18};Object.defineProperty(person, 'isAdult', {
    Configurable : false,
    get: function () {        if (this._age >= 18) {            return true;
        } else {            return false;
        }
    }
});console.log( person.isAdult );  // true
로그인 후 복사

하지만 여전히 필요한 것이 하나 있습니다. 특히 주의하세요. Object.defineProperty() 메서드를 사용하여 속성을 설정할 때 접근자 속성(설정 및 가져오기)과 데이터 속성(쓰기 가능 또는 값)을 동시에 선언할 수 없습니다. 즉, 속성에 쓰기 가능 또는 값 속성 세트가 있는 경우 이 속성은 get 또는 set을 선언할 수 없으며 그 반대의 경우도 마찬가지입니다.

如若像下面的方式进行定义,访问器属性和数据属性同时存在:

var o = {};Object.defineProperty(o, 'name', {
    value: 'wenzi',
    set: function(name) {
        myName = name;
    },
    get: function() {        return myName;
    }
});
로그인 후 복사

上面的代码看起来貌似是没有什么问题,但是真正执行时会报错,报错如下:

Uncaught TypeError: Invalid property. A property cannot both have accessors and be writable or have a value

对于数据属性,可以取得:configurable,enumberable,writable和value;

对于访问器属性,可以取得:configurable,enumberable,get和set。

由此我们可知:一个变量或属性是否可以被删除,是由其内部属性Configurable进行控制的,若Configurable为true,则该变量或属性可以被删除,否则不能被删除。

可是我们应该怎么获取这个Configurable值呢,总不能用delete试试能不能删除吧。有办法滴!!

2.3 获取内部属性

ES5为我们提供了Object.getOwnPropertyDescriptor(object, property)来获取内部属性。

如:

var person = {name:'wenzi'};var desp = Object.getOwnPropertyDescriptor(person, 'name'); // person中的name属性console.log( desp );    // {value: "wenzi", writable: true, enumerable: true, configurable: true}
로그인 후 복사

通过Object.getOwnPropertyDescriptor(object, property)我们能够获取到4个内部属性,configurable控制着变量或属性是否可被删除。这个例子中,person.name的configurable是true,则说明是可以被删除的:

console.log( person.name );         
// wenziconsole.log( delete person.name );  
// true,删除成功console.log( person.name );         
// undefined
로그인 후 복사

我们再回到最开始的那个面试题:

a = 1;var desp = Object.getOwnPropertyDescriptor(window, 'a');console.log( desp.configurable );   // true,可以删除var b = 2;var desp = Object.getOwnPropertyDescriptor(window, 'b');console.log( desp.configurable );   // false,不能删除
로그인 후 복사

跟我们使用delete操作删除变量时产生的结果是一样的。

相关推荐:

JavaScript delete操作符应用实例_javascript技巧

위 내용은 js의 삭제 연산자 및 내부 속성 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿