本文参考自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
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END