zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    软件设计师 -算法设计与分析
    windows下git使用
    SourceTree免注册并连码云
    软件设计师-软件工程基础知识
    基本约瑟夫环问题详解
    SGU180(树状数组,逆序对,离散)
    POJ(1195)(单点修改,区间查询)(二维)
    C++ bitset
    冯志远0920
    怎样学好哲学(lucas+费马小定理)
  • 原文地址:https://www.cnblogs.com/zhuiluoyu/p/5012958.html
Copyright © 2011-2022 走看看