那些年,前端进修之路的疑难杂症(二):delete的运用引见

delete 操纵符用来删除一个对象的属性

语法EDIT

delete expression

expression 应该是一个对象的属性援用,比方:

delete object.property

delete object['property']

假如 expression 的计算结果不是一个对象的属性援用,那末,delete不会起任何作用。

参数

 objectName 对象名.

 property 须要删除的属性.

返回值

【注重】在严厉形式中,假如属性是一个不可设置(non-configurable)属性,删除时会抛出非常,非严厉形式下返回 false。其他状况都返回 true。

形貌EDIT

delete 操纵符与直接开释内存(只能经由过程消除援用来间接开释)没有关系。可检察内存治理页面。

【注重】你能够运用 delete 操纵符来删除一个隐式声明的全局变量,也就是没有运用 var 定义的全局变量.全局变量实际上是global对象(window)的属性.

假如 delete 操纵符删除胜利,则被删除的属性将从所属的对象上完整消逝。然后,假如该对象的原型链上有一个同名属性,则该对象会从原型链上继续该同名属性。

Temporal dead zone

在ECMAScript 6中,经由过程 const 或 let 声明指定的 “temporal dead zone” (TDZ) 对 delete 操纵符也会起作用。因而,下面的代码将会抛出 ReferenceError。

function foo(){
delete x;
let x;
}

function bar() {
delete y;
const y;
}
一些对象的属性不能被delete. ECMA 262 范例中把这些属性标记为 DontDelete.

x = 42; // 隐式声明的全局变量
var y = 43; // 显式声明的全局变量
myobj = {
h: 4,
k: 5
}

// 隐式声明的全局变量能够被删除
delete x; // 返回 true

// 显式声明的全局变量不能被删除,该属性不可设置(not configurable)
delete y; // 返回 false

//内置对象的内置属性不能被删除
delete Math.PI; // 返回 false

//用户定义的属性能够被删除
delete myobj.h; // 返回 true

// myobj 是全局对象(window)的属性,而不是变量,因而能够被删除
delete myobj; // 返回 true

function f() {
var z = 44;

// delete doesn’t affect local variable names
delete z; // returns false
}
你不能删除一个对象从原型继续而来的属性(不过你能够从原型上直接删掉它).

function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();

// 无效的操纵
delete foo.bar;

// logs 42,继续的属性
console.log(foo.bar);

// 直接删除原型上的属性
delete Foo.prototype.bar;

// logs “undefined”,已没有继续的属性
console.log(foo.bar);
删除数组元素

当你删除一个数组元素时,数组的 length 属性并不会变小。
比方,假如你删除了a[3], a[4]依然是a[4], a[3]成为undefined. 即使你删除了末了一个元素也是云云 (delete a[a.length-1]).

当用 delete 操纵符删除一个数组元素时,被删除的元素已完整不属于该数组。下面的例子中, trees[3] 被运用delete完整删除。

var trees = [“redwood”,”bay”,”cedar”,”oak”,”maple”];
delete trees[3];
if (3 in trees) {
// 这里不会被执行
}
假如你想让一个数组元素的值变成 undefined 而不是删除它,能够运用 undefined 给其赋值而不是运用 delete 操纵符。下面的例子中,trees[3] 被赋值为undefined,但该元素依然存在。

var trees = [“redwood”,”bay”,”cedar”,”oak”,”maple”];
trees[3]=undefined;
if (3 in trees) {
// 这里会被执行
}

总结:

1.delete运用准绳:delete 操纵符用来删除一个对象的属性。
2.delete在删除一个不可设置的属性时在严厉形式和非严厉形式下的区分:
在严厉形式中,假如属性是一个不可设置(non-configurable)属性,删除时会抛出非常;
非严厉形式下返回 false。
3.delete能删除隐式声明的全局变量:这个全局变量实际上是global对象(window)的属性
4.delete能删除的:
(1)可设置对象的属性(2)隐式声明的全局变量 (3)用户定义的属性 (4)在ECMAScript 6中,经由过程 const 或 let 声明指定的 “temporal dead zone” (TDZ) 对 delete 操纵符也会起作用
delete不能删除的:
(1)显式声明的全局变量 (2)内置对象的内置属性 (3)一个对象从原型继续而来的属性
5.delete删除数组元素:
(1)当你删除一个数组元素时,数组的 length 属性并不会变小,数组元素变成undefined
(2)当用 delete 操纵符删除一个数组元素时,被删除的元素已完整不属于该数组。
(3)假如你想让一个数组元素的值变成 undefined 而不是删除它,能够运用 undefined 给其赋值而不是运用 delete 操纵符。此时数组元素是在数组中的
6.delete 操纵符与直接开释内存(只能经由过程消除援用来间接开释)没有关系。

    原文作者:specialCoder
    原文地址: https://segmentfault.com/a/1190000008356757
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞