이 기사에서는 주로 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입니다.
삭제를 사용하여 변수나 속성을 삭제할 때 삭제에 성공하면 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
위의 예에서 일부 변수 또는 속성은 삭제할 수 있지만 일부 변수 또는 속성은 삭제할 수 없습니다. 따라서 이 변수 또는 속성을 삭제할 수 있는지 여부는 어떻게 결정됩니까?
ECMA-262 5판은 JS 객체 속성(JS 엔진에서 사용되며 외부에서 직접 액세스할 수 없음)의 특성을 정의합니다. ECMAScript에는 데이터 속성과 접근자 속성이라는 두 가지 속성이 있습니다.
데이터 속성은 값을 읽거나 쓸 수 있는 데이터 값이 포함된 위치를 나타냅니다. 이 속성은 해당 동작을 설명하는 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);
주로 한 쌍의 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
如若像下面的方式进行定义,访问器属性和数据属性同时存在:
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试试能不能删除吧。有办法滴!!
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!