JavaScript

[JavaScript] delete operator

2017-11-03  本文已影响12人  何幻

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)删除用varfunction声明的变量

在全局作用域(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)删除用letconst定义的变量

无法删除用letconst定义的变量,会返回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

定义adelete a,然后一起执行,则返回false,(正确)

let a=1;
delete a;
> false

a
> 1

(5)删除configurablefalse的属性

无法删除configurablefalse的属性,会返回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.
}

在严格模式下,删除configuablefalse的属性,会抛异常,

'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

上一篇 下一篇

猜你喜欢

热点阅读