delete操作符总结

本文参考自MDN官方网站

几天前我看了一篇关于Delete的文章,里面提到了delete操作与map的delete操作的关系与区别,这大大勾起了我对于delete这个在js来说常见的不能再常见的操作符的兴趣。

在那位文章的作者提到map的delete操作性能优于delete操作符直接删除对象的性能,这一点勾起了我的兴趣接下来我将对我所看到的,所理解的一一奉上。

delete

delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放。

const Employee = {
  firstname: 'John',
  lastname: 'Doe'
};

console.log(Employee.firstname);
// expected output: "John"

delete Employee.firstname;

console.log(Employee.firstname);
// expected output: undefined
复制代码

上面就是关于delete操作符的一个简单的使用,用法为:delete expression。

delete操作同样拥有返回结果:true代表删除成功,false代表删除失败。这里需要注意,当你删除一个不存在的属性的时候,同样也会返回true。

在内存管理方面:delete的操作并不会直接影响到内存,与直接内存释放无关,此处delete的作用只是断开了对象的引用,断开之后当内存回收触发的时候,就会回收该对象(这块涉及到内存管理的知识了,暂时先不在此处细说)。


不可设置属性

当一个属性被设置为不可设置,delete操作将不会有任何效果,并且会返回false。

var Employee = {};
Object.defineProperty(Employee, 'name', {configurable: false});
console.log(delete Employee.name);  // returns false
复制代码

var, let以及const创建的不可设置的属性不能被delete操作删除。

var nameOther = 'XYZ';

// 通过以下方法获取全局属性:
Object.getOwnPropertyDescriptor(window, 'nameOther');

// 输出: Object {value: "XYZ",
//                  writable: true,
//                  enumerable: true,
//                  configurable: false}

// 因为“nameOther”使用var关键词添加,
// 它被设置为不可设置(non-configurable)
delete nameOther;   // return false
复制代码

在严格模式下,这样的操作会抛出异常。

任何使用var声明的变量都会被标记为不可设置的。

Reflect.deleteProperty()

作用和delete操作符类似,但它是一个函数。该方法存在一个返回值为boolean类型。demo如下。

var obj = { x: 1, y: 2 };
Reflect.deleteProperty(obj, "x"); // true
obj; // { y: 2 }

var arr = [1, 2, 3, 4, 5];
Reflect.deleteProperty(arr, "3"); // true
arr; // [1, 2, 3, , 5]

// 如果属性不存在,返回 true
Reflect.deleteProperty({}, "foo"); // true

// 如果属性不可配置,返回 false
Reflect.deleteProperty(Object.freeze({foo: 1}), "foo"); // false
复制代码

Map.prototype.delete()

delete() 方法用于移除 Map 对象中指定的元素。

返回值:如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false。

const map1 = new Map();
map1.set('bar', 'foo');

console.log(map1.delete('bar'));
// expected result: true
// (true indicates successful removal)

console.log(map1.has('bar'));
// expected result: false
复制代码

猜你喜欢

转载自juejin.im/post/6983660858530332679