MST

星途 面试题库

面试题:JavaScript 中对象属性特性如何影响对象的基本操作

请阐述 JavaScript 中对象属性的 writable、configurable 和 enumerable 特性对对象的属性赋值、删除以及遍历操作分别有什么影响,并举例说明。
12.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. writable特性
    • 对属性赋值的影响:如果writabletrue,可以对属性进行赋值操作;如果为false,尝试对该属性赋值时,在非严格模式下不会报错,但赋值无效,在严格模式下会抛出错误。
    • 对删除操作的影响writable特性本身不直接影响删除操作,删除操作主要受configurable特性影响。
    • 对遍历操作的影响writable特性不影响属性的遍历。
    • 示例
const obj = {};
Object.defineProperty(obj, 'prop', {
    value: 10,
    writable: false
});
// 非严格模式下,赋值无效但不报错
obj.prop = 20;
console.log(obj.prop); // 输出 10
// 严格模式下
'use strict';
const strictObj = {};
Object.defineProperty(strictObj, 'prop', {
    value: 10,
    writable: false
});
// 尝试赋值会抛出TypeError
strictObj.prop = 20; 
  1. configurable特性
    • 对属性赋值的影响configurable特性本身不直接影响属性赋值操作,主要由writable决定能否赋值。
    • 对删除操作的影响:如果configurabletrue,可以使用delete操作符删除该属性;如果为false,在非严格模式下删除操作不报错但不会删除属性,在严格模式下会抛出错误。
    • 对遍历操作的影响:如果configurablefalse,使用Object.defineProperty重新定义该属性时,不能修改其可枚举性(enumerable)、可配置性(configurable)以及数据描述符的valuewritable特性(访问器描述符有不同规则)。这间接影响到后续遍历,因为如果不能修改enumerable,就无法改变属性是否出现在遍历中。
    • 示例
const obj = {};
Object.defineProperty(obj, 'prop', {
    value: 10,
    configurable: false
});
// 非严格模式下,删除操作不报错但属性不会被删除
delete obj.prop;
console.log(obj.prop); // 输出 10
// 严格模式下
'use strict';
const strictObj = {};
Object.defineProperty(strictObj, 'prop', {
    value: 10,
    configurable: false
});
// 尝试删除会抛出TypeError
delete strictObj.prop; 
  1. enumerable特性
    • 对属性赋值的影响enumerable特性不影响属性的赋值操作。
    • 对删除操作的影响enumerable特性不直接影响删除操作。
    • 对遍历操作的影响:如果enumerabletrue,属性会出现在for...in循环、Object.keys()以及JSON.stringify()等遍历操作中;如果为false,则不会出现在这些遍历操作中,但仍可通过直接访问属性名来访问该属性。
    • 示例
const obj = {};
Object.defineProperty(obj, 'prop1', {
    value: 10,
    enumerable: true
});
Object.defineProperty(obj, 'prop2', {
    value: 20,
    enumerable: false
});
for (let key in obj) {
    console.log(key); // 只会输出 'prop1'
}
console.log(Object.keys(obj)); // 输出 ['prop1']
console.log(obj.prop2); // 仍可访问,输出 20