javascript 中的 delete

1.对象属性删除

function fun(){
 
this.name = 'mm';
 
}
 
var obj = new fun();
 
console.log(obj.name);//mm
 
delete obj.name;
 
console.log(obj.name); //undefined

 2.变量删除

var name = 'lily';
delete name;
console.log(name); //lily

 直接用delelte删除不了变量

3.删除不了原型链中的变量

fun.prototype.age = 18;
delete obj.age;
console.log(obj.age) //18

 4.删除不了函数

    function x(){}  
    delete x; // false  
    typeof x; // "function"  

 注意delete只有在无法删除的情况下才会返回false。

Activation object / Variable object(活动对象/变量对象)

    /* 全局环境下,this所指向的就是这个全局对象 */  
    var GLOBAL_OBJECT = this;  
      
    var foo = 1;  
    GLOBAL_OBJECT.foo; // 1  
    foo === GLOBAL_OBJECT.foo; // true  
      
    function bar(){}  
    typeof GLOBAL_OBJECT.bar; // "function"  
    GLOBAL_OBJECT.bar === bar; // true  
    (function(foo){  
      
      var bar = 2;  
      function baz(){}  
      
      /* 
      可以把活动对象作为一个抽象的存在,在每进入一个函数的时候,默认的arguments对象以及传入的参数都会自动被设为活动对象的属性:  
        ACTIVATION_OBJECT.arguments; // arguments变量 
     
      传入参数foo: 
        ACTIVATION_OBJECT.foo; // 1 
     
        函数内声明的变量bar: 
        ACTIVATION_OBJECT.bar; // 2 
     
        以及函数内定义的baz函数: 
        typeof ACTIVATION_OBJECT.baz; // "function" 
      */  
      
    })(1);  

 在声明变量或者函数时,他们都变成了当前上下文对象的属性--对于函数代码来说是活动对象,对于全局代码来说则是变量对象,而值得注意的是这些属性在创建时 都带有DontDelete标记,但是显式或者隐式的赋值语句所产生的属性并不会带有这个标记!这就是为什么有一些属性我们可以删除,但另一些却不可以:

var GLOBAL_OBJECT = this;  
  
/*  foo是被正常声明的,所以带有DontDelete标记,从而不能被删除! */  
  
var foo = 1;  
delete foo; // false  
typeof foo; // "number"  
  
/* bar是作为函数被声明,一样带有DontDelete,不能被删除。 */  
  
function bar(){}  
delete bar; // false  
typeof bar; // "function"  
  
/*  baz是直接通过一个赋值而没有声明,不会持有DontDelete标记,才可以被删除! */  
  
GLOBAL_OBJECT.baz = 'blah';  
delete GLOBAL_OBJECT.baz; // true  
typeof GLOBAL_OBJECT.baz; // "undefined"

 DontDelete就是一个特殊的标记,用来表明某一个属性能否被删除。需要注意的是一些内建的对象是自动持有这个标记的,从而不能被删除,比如函数内的arguments,以及函数的length属性。

    (function(){  
      
      /*arguments对象默认持有DontDelete标记,不能被删除。 */  
      
      delete arguments; // false  
      typeof arguments; // "object"  
      
      /* 函数的length属性也一样 */  
      
      function f(){}  
      delete f.length; // false  
      typeof f.length; // "number"  
      
    })();  

  函数的传入参数也是一样的:

    (function(foo, bar){  
      
      delete foo; // false  
      foo; // 1  
      
      delete bar; // false  
      bar; // 'blah'  
      
    })(1, 'blah');  
    var GLOBAL_OBJECT = this;  
      
    /* 通过声明的全局变量会持有DontDelete,无法被删除。 */  
    var foo = 1;  
      
    /* 没有经过声明的变量赋值不会带DontDelete,可以被删除。 */  
    bar = 2;  
      
    delete foo; // false  
    typeof foo; // "number"  
      
    delete bar; // true  
    typeof bar; // "undefined"  

 需要注意的是属性标记诸如DontDelete是在这个属性被创建的时候 产生的,之后对该属性的任何赋值都不会改变此属性的标记!

    /* foo被声明时会带有DontDelete标记 */  
    function foo(){}  
      
    /* 之后对foo的赋值无法改变他所带的标记! */  
    foo = 1;  
    delete foo; // false  
    typeof foo; // "number"  
      
    /* 当给一个还不存在的属性赋值的时候会创建一个不带任何标记的属性(包括DontDelete),进而可以被删除! */  
      
    this.bar = 1;  
    delete bar; // true  
    typeof bar; // "undefined"  

 转载:javascript delete操作符  http://www.cnblogs.com/yuzhongwusan/archive/2012/06/14/2549879.html

原文地址:https://www.cnblogs.com/zhuiluoyu/p/5012958.html