delete 操作符和 Reflect.deleteProperty API

1,426 阅读2分钟

Delete 操作符

delete 操作符会从某个对象上移除指定属性,对于所有情况都是true,除非属性是一个不可配置的属性。在这种情况下,非严格模式返回 false,在严格模式下会抛出TypeError

注意事项

  1. 删除不存在的属性仍会返回 true
console.log(delete _undefined) // true
  1. delete 操作只会在自身的属性上起作用。
const obj = {'toString':'test'}
delete obj.toString // 第一次
delete obj.toString // 第二次
console.log('toString' in obj.__proto__) // true
  1. delete 无法删除使用 varletconst 关键字声明的变量和函数表达式,但可以删除隐式声明的变量和函数表达式。(因为是挂在 window 上?)
var a = 1;
let b = 2;
const c = 3;
var fn = ()=>{}
d = 4
console.log(delete a); // false
console.log(delete b); // false
console.log(delete c); // false
console.log(delete fn); // false
console.log(delete d); // true
console.log(a); // 1 
console.log(b); // 2
console.log(c); // 3
console.log(fn); // ()=>{}
console.log(d); // ReferenceError: d is not defined
  1. delete 无法删除函数声明
function fn (){}
console.log(delete fn) // false
  1. 不可配置的(Non-configurable)属性不能被删除、Math, Array, Object 内置对象的属性以及使用Object.defineProperty()方法设置为不可设置的属性不能被删除。如果在严格模式下,delete 不可配置的属性,会抛出 SyntaxError。注意:MathArrayObject对象本身不是不可配置的,所以可以被删除。
console.log(delete Math.PI)// false
console.log(delete Math)// true
let pet = {}
Object.defineProperty(pet,'name',{value:'咪咪'})
console.log(delete pet.name) // false
console.log(pet.name) // '咪咪'
  1. delete 删除一个数组元素时,数组的长度不受影响。
const arr = [1,2,3]
console.log(delete arr[2]) // true
console.log(arr) // [1,2,empty]
console.log(arr.length) // 3

Reflect.deleteProperty API

Reflect.deleteProperty:是 ES6 推出的函数式的删除属性的方法。

Reflect.deleteProperty(target, propertyKey)
  • target:删除属性的目标对象。
  • propertyKey:需要删除的属性的名称。

返回Boolean值表明该属性是否被成功删除。

注意事项

  1. 如果 target 不是 Object 抛出一个 TypeError
  2. 即使在严格模式下,删除不可配置属性也不会报错,只是返回 false。行为和非严格模式下的 delete 操作符相似。
 'use strict'
    console.log(Reflect.deleteProperty(Math,'PI')) // false