delete
运算符,并不会直接释放内存,
但是它会断开引用,间接的与内存管理有关。
delete
运算符会删除给定对象的属性,
如果成功的话,就会返回true
,否则返回false
。
(1)删除一个不存在的属性
如果待删除的属性不存在,会直接返回true
。
const a ={};
delete a.b; // true
*(2)删除原型链上的属性
无法删除原型链上的属性,但仍然会返回true
。
const a ={b: 1};
const c = Object.create(a);
delete c.b; // true
c.b // 1
(3)删除用var
或function
声明的变量
在全局作用域(global scope)或函数作用域(function scope)中,
无法删除使用var
声明的变量,会返回false
。
无法删除使用function
声明的函数,会返回false
。
var a = 1;
delete a; // false
a // 1
function f(){}
delete f; // false
f // f(){}
function fn(){
var x = 1;
function g(){}
delete x; // false
delete g; // false
x // 1
g // g(){}
}
但是如果直接对全局对象赋值(显式或隐式的),则可以删除。
// 显式赋值
window.a=1;
delete a; // true
a // Uncaught ReferenceError: a is not defined
// 隐式赋值
b=1;
delete b; // true
b // Uncaught ReferenceError: b is not defined
(4)删除用let
或const
定义的变量
无法删除用let
或const
定义的变量,会返回false
。
let a=1;
delete a; // false
a // 1
const b=1;
delete b; // false
b // 1
function f(){
let a =1;
const b=1;
delete a; // false
delete b; // false
a // 1
b // 1
}
注:
在Chrome 61.0.3163.100(正式版本) (64 位)
控制台中,
先定义a
,然后执行,再delete a
,则返回true
,(不正确)
let a=1;
> undefined
delete a;
> true
a
> 1
定义a
,delete a
,然后一起执行,则返回false
,(正确)
let a=1;
delete a;
> false
a
> 1
(5)删除configurable
为false
的属性
无法删除configurable
为false
的属性,会返回false
。
const a=Object.defineProperty({}, 'b', {configurable: false, value:1});
delete a.b; // false
a.b // 1
*(6)删除数组元素
当使用索引删除数组元素的时候,数组长度不会受影响。
就算删除了数组末尾的元素,也是如此。
被删除的数组元素,会变成不可枚举的“空洞”。
const a=[1,2,3];
delete a[1]; // true
a // [1, empty × 1, 3]
a.hasOwnProperty(1) // false
for(var i in a){
console.log(i); // 0 2
}
(7)在严格模式下删除
在严格模式下,删除变量,会抛异常,
'use strict'
const a=1;
delete a; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
function f(){
let a =1;
delete a; //Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
}
在严格模式下,删除configuable
为false
的属性,会抛异常,
'use strict'
const a = Object.defineProperty({}, 'b', { configurable: false, value: 1 });
delete a.b; // Uncaught TypeError: Cannot delete property 'b' of #<Object>
参考
MDN: delete operator
MDN: Reflect.deleteProperty()
ECMAScript: 12.5.3 The delete Operator
网友评论