深入理解delete操作符

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 操作做出的反应
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值