资讯专栏INFORMATION COLUMN

深入理解delete操作符

NSFish / 3531人阅读

摘要:原型中声明的属性和对象自带的属性原型中声明的属性和对象自带的属性其实这些属性也是在原型中的可以认为是带有特性的,无法被删除。注意内置对象的一些属性拥有内部属性,因此不能被删除特殊的变量活化对象的属性拥有任何函数实例的返回形参长度属性也拥有。

http://bubkoo.com/2014/01/23/...

原型中声明的属性和对象自带的属性

==原型 prototype 中声明的属性和对象自带的属性(其实这些属性也是在原型 prototype 中的)可以认为是带有 DontDelete 特性的,无法被删除==。例如:

//原型中声明的属性无法被删除
function C() { this.x = 42; }
C.prototype.x = 12;
var o = new C();
o.x;     // 42, 构造函数中定义的o.x
delete o.x;
o.x;     // 12,  prototype中定义的o.x,即使再次执行delete o.x也不会被删除
//对象自带的属性无法被删除
var re = /abc/i;
delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase无法删除
内置对象和DontDelete

些属性不能被删除的根本原因在于:==这些属性拥有内部属性 DontDelete==,该内部属性控制着该属性是否可以被删除。注意:内置对象的一些属性拥有内部属性 DontDelete,因此不能被删除; 特殊的 arguments 变量(活化对象的属性)拥有 DontDelete; 任何函数实例的 length (返回形参长度)属性也拥有 DontDelete。与函数 arguments 相关联的属性也拥有 DontDelete,同样不能被删除:

(function() {
    //不能删除"arguments",因为有DontDelete
    delete arguments; // false;
    typeof arguments; // "object"
    //也不能删除函数的"length",因为有DontDelete
    function f() {};
    delete f.length; // false;
    typeof f.length; // "number"
}) ();


--------

(function(foo, bar) {
    delete foo; // false
    foo; // 1
    delete bar; // false
    bar; // "bah"
}) (1, "bah");
总结

下面是对于 JavaScript 中 delete 操作是如何工作的简短的总结:

变量和函数声明都是活化对象(Activation Object) 或全局对象(Global Object)的属性

属性拥有内部属性,其中 DontDelete 这个内部属性负责确定一个属性是否能够被删除

在全局或者函数代码中的变量和函数声明总是创建带有 DontDelete 特性的属性

函数参数总是活动对象的属性, 并且带有 DontDelete

在 Eval 代码中声明的变量和函数总是创建不带 DontDelete 特性 的属性

新的未声明的属性在生成时带空的内部属性,因此也不带 DontDelete 特性

永远不要相信宿主对象对 delete 操作做出的反应

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

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

相关文章

  • 编写高质量Javascript的要点-Review深入理解Javascript系列(一)

    摘要:编写高质量的要点深入理解系列一知识点最小全局变量全局变量命名易与第三方的脚本引起冲突所以尽可能少的使用全局变量是很重要的相关策略有命名空间模式或是函数立即自动执行,但是要想让全局变量少最重要的还是始终使用来声明变量。 Title: 编写高质量Javascript的要点-Review深入理解Javascript系列(一)date: 2017-6-9 14:14:20 status: p...

    wh469012917 评论0 收藏0
  • JavaScript深入浅出

    摘要:理解的函数基础要搞好深入浅出原型使用原型模型,虽然这经常被当作缺点提及,但是只要善于运用,其实基于原型的继承模型比传统的类继承还要强大。中文指南基本操作指南二继续熟悉的几对方法,包括,,。商业转载请联系作者获得授权,非商业转载请注明出处。 怎样使用 this 因为本人属于伪前端,因此文中只看懂了 8 成左右,希望能够给大家带来帮助....(据说是阿里的前端妹子写的) this 的值到底...

    blair 评论0 收藏0
  • 深入理解ES6笔记(七)Set集合和Map集合

    摘要:创建并添加项目可以使用数组来初始化一个,并且构造器会确保不重复地使用这些值使用方法来测试某个值是否存在于中移除值使用方法来移除单个值,或调用方法来将所有值从中移除。属性的初始化将数组传递给构造器,以便使用数据来初始化一个。 主要知识点:Set的基本操作,Weak Set,Map的基本操作,Weak MapshowImg(https://segmentfault.com/img/bVbf...

    loostudy 评论0 收藏0
  • 深入理解:ES6中的Set和Map数据结构,Map与其它数据结构的互相转换

    摘要:学习笔记工作中常用到的语法只是简单提及和,今天有空于是写了这篇文章深入理解中的和数据结构,与其它数据结构的互相转换。的提供了新的数据结构。本身是一个构造函数,用来生成数据结构。 文中的内容主要是来自于阮一峰的《ES6标准入门》(第三版)。《学习ES6笔记──工作中常用到的ES6语法》只是简单提及Set和Map,今天有空于是写了这篇文章──《深入理解:ES6中的Set和Map数据结构,M...

    Cristalven 评论0 收藏0

发表评论

0条评论

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