MST

星途 面试题库

面试题:JavaScript对象不可扩展后相关操作的影响

假设你通过某种方式将一个JavaScript对象设置为不可扩展,当尝试为该对象添加新属性、修改现有属性的特性(如configurable、enumerable等)时会发生什么?请详细说明每种操作的具体行为,并解释原因。同时,给出相应的代码示例来验证你的说法。
25.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 添加新属性
    • 行为:当尝试为不可扩展的对象添加新属性时,操作不会成功,并且在严格模式下会抛出TypeError。在非严格模式下,不会抛出错误,但新属性也不会被添加到对象中。
    • 原因:JavaScript通过将对象的[[Extensible]]内部属性设置为false来表示对象不可扩展。当尝试添加新属性时,JavaScript引擎会检查这个属性,如果为false,则拒绝添加新属性。
    • 代码示例
// 创建一个不可扩展的对象
const obj = {};
Object.preventExtensions(obj);

// 非严格模式下尝试添加新属性
obj.newProp = 'new value';
console.log(obj.newProp); // undefined

// 严格模式下尝试添加新属性
function addPropInStrictMode() {
  'use strict';
  const obj = {};
  Object.preventExtensions(obj);
  obj.newProp = 'new value'; // 抛出TypeError
}
// addPropInStrictMode(); // 取消注释会看到TypeError
  1. 修改现有属性的特性(如configurable、enumerable等)
    • 行为:如果属性本身是可配置的(configurable: true),那么仍然可以修改其特性。但是如果属性是不可配置的(configurable: false),则无法修改其特性,在严格模式下会抛出TypeError,非严格模式下修改操作被忽略。
    • 原因configurable特性决定了是否可以修改属性的其他特性(如configurableenumerablewritable)以及是否可以删除属性。对于不可扩展对象,属性的configurable特性遵循其原有设置。
    • 代码示例
// 创建一个不可扩展的对象并添加一个可配置属性
const obj1 = {};
Object.preventExtensions(obj1);
obj1.prop1 = 'value1';
Object.defineProperty(obj1, 'prop1', {
  configurable: true
});

// 修改可配置属性的enumerable特性
Object.defineProperty(obj1, 'prop1', {
  enumerable: false
});
console.log(Object.getOwnPropertyDescriptor(obj1, 'prop1').enumerable); // false

// 创建一个不可扩展的对象并添加一个不可配置属性
const obj2 = {};
Object.preventExtensions(obj2);
obj2.prop2 = 'value2';
Object.defineProperty(obj2, 'prop2', {
  configurable: false
});

// 尝试修改不可配置属性的enumerable特性
function modifyNonConfigurableProp() {
  'use strict';
  Object.defineProperty(obj2, 'prop2', {
    enumerable: false
  }); // 抛出TypeError
}
// modifyNonConfigurableProp(); // 取消注释会看到TypeError