资讯专栏INFORMATION COLUMN

那些年,前端学习之路的疑难杂症(二):delete的使用介绍

tainzhi / 2689人阅读

摘要:如果你想让一个数组元素的值变为而不是删除它,可以使用给其赋值而不是使用操作符。此时数组元素是在数组中的操作符与直接释放内存只能通过解除引用来间接释放没有关系。

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 操作符与直接释放内存(只能通过解除引用来间接释放)没有关系。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/81536.html

相关文章

  • 那些前端学习之路疑难杂症(三):数组和Date一些梳理

    摘要:将指定的数字索引值转换成字符串索引值变成,然后将其作为属性名来用。返回一个由删除元素组成的数组。该方法返回的数组元素是调用的数组的一个子集。使用的函数有四个参数初始值积累值数组元素元素索引数组本身。 前言 很多人在学习原生JS的过程中会遇到一些疑惑,比如在学习array时,就很容易搞不清哪些方法会改变原来数组,哪些方法不会改变原来数组?再比如很多人会使用new Date()获取时间,却...

    xeblog 评论0 收藏0
  • 那些前端学习之路疑难杂症(一):严格模式与非严格模式

    摘要:反之亦然非严格合并严格看起来是非严格的。在普通的里面给一个拼写错误的变量名赋值会使全局对象新增一个属性并继续工作尽管后面可能出错在现在的中有可能。第三严格模式禁止删除声明变量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用严格模式 ECMAScript 5的严格模式是JavaScript中的一种限制性更强的变种方式。严格模式不是一个...

    zombieda 评论0 收藏0
  • 那些前端学习之路疑难杂症(四):面试中遇到3个问题概览

    摘要:闭包能用来实现私有化和创建工厂函数等作用。关于闭包的常见面试题是这样的写一个函数,循环一个整数数组,延迟秒打印这个数组中每个元素的索引。 文章来源:http://mp.weixin.qq.com/s/vs0... 前言 在公众号上看到了这篇文章,觉得很有用,有助于理解JS学习中的一些重点难点。决定把它整理下发布出来。该文章主要介绍了JS中的三个问题。在以后的几篇文章里,我会详细介绍这三...

    gecko23 评论0 收藏0
  • 「码个蛋」2017200篇精选干货集合

    摘要:让你收获满满码个蛋从年月日推送第篇文章一年过去了已累积推文近篇文章,本文为年度精选,共计篇,按照类别整理便于读者主题阅读。本篇文章是今年的最后一篇技术文章,为了让大家在家也能好好学习,特此花了几个小时整理了这些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 让你收获满满! 码个蛋从2017年02月20...

    wangtdgoodluck 评论0 收藏0
  • 深入理解js

    摘要:详解十大常用设计模式力荐深度好文深入理解大设计模式收集各种疑难杂症的问题集锦关于,工作和学习过程中遇到过许多问题,也解答过许多别人的问题。介绍了的内存管理。 延迟加载 (Lazyload) 三种实现方式 延迟加载也称为惰性加载,即在长网页中延迟加载图像。用户滚动到它们之前,视口外的图像不会加载。本文详细介绍了三种延迟加载的实现方式。 详解 Javascript十大常用设计模式 力荐~ ...

    caikeal 评论0 收藏0

发表评论

0条评论

tainzhi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<