面试官 🤔:如何删除JS对象上的一个属性……

71 阅读2分钟

Screen Recording 2024-07-06 at 00.19.27 (4).gif

使用delete运算符

delete 运算符用于删除对象的一个属性;如果该属性的值是一个对象,并且没有更多对该对象的引用,该属性所持有的对象最终会自动释放。

// 定义一个对象
let obj = {
  a: 1,
  b: 2,
  c: 3
};

// 删除属性 'b'
delete obj.b;

console.log(obj); // 输出: { a: 1, c: 3 }

delete 运算符的返回值

对于大多数情况都是 true;如果属性是一个自身不可配置的属性,在这种情况下,非严格模式返回 false

这里的“自身不可配置”,是指属性描述符 configurablefalse,此时意味着该属性不可以被删除

// 创建一个对象,其中包含一个不可配置的属性
var obj = Object.defineProperties({}, {
  myProp: {
    value: 42,
    writable: true,
    enumerable: true,
    configurable: false // 属性不可配置
  }
});

// 尝试使用 delete 运算符删除 myProp 属性
var result = delete obj.myProp;

console.log(result); // 在非严格模式下输出 false
console.log(obj.myProp); // 输出 42,属性依然存在

其他方法

使用 Reflect.deleteProperty

Reflect.deleteProperty 允许你删除一个对象上的属性。返回一个Boolean值表示该属性是否被成功删除。它几乎与非严格的delete 运算符相同

var obj = { a: 1, b: 2 };
console.log(Reflect.deleteProperty(obj, 'a')); // 输出 true
console.log(obj); // 输出 { b: 2 }
解构赋值

通过解构赋值,将想要删除的属性剥离出来

// 创建一个对象
let person = {
    name: "Alice",
    age: 30,
    job: "Engineer"
};

// 使用解构赋值来删除属性
const { age, ...newPerson } = person;

// 输出新对象
console.log(newPerson);  // { name: 'Alice', job: 'Engineer' }
使用 Object.keys()reduce()

对属性名进行过滤,把想要删除的属性过滤掉

// 创建一个对象
let person = {
    name: "Alice",
    age: 30,
    job: "Engineer"
};

// 使用 Object.keys() 和 reduce() 来创建新对象
let newPerson = Object.keys(person).reduce((result, key) => {
    if (key !== 'age') {
        result[key] = person[key];
    }
    return result;
}, {});

// 输出新对象
console.log(newPerson);  // { name: 'Alice', job: 'Engineer' }