关于 delete 操作符

首先,delete 是一个操作符而不是一个方法,所以 用法是 

delete A; 而不是 A.delete()
 
每一个变量属性都可以有以下任意多个属性: ReadOnly, DontEnum, DontDelete, Internal。你可以把这些当做标记,标明了变量属性可以持有的某种特性。注意,属性标记诸如DontDelete是在这个属性被创建的时候产生的,之后对该属性的任何赋值都不会改变此属性的标记。
     1.     在声明变量或者函数时,他们都变成了当前上下文对象的属性--对于函数代码来说是活动对象,对于全局代码来说则是变量对象,而值得注意的是这些属性在创建时都带有DontDelete标记。但是显式或者隐式(而不是通过变量声明或者函数声明创建)的赋值语句所产生的属性并不会带有这个标记。
因此:
        var GLOBAL_OBJECT = this;

        /*  foo是被正常声明的,所以带有DontDelete标记,从而不能被删除! */

        var foo = 1;
        delete foo; // false 
        typeof foo; // "number"  注意typeof返回的是字符串,因此需要加引号

        /* 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"

        m = 1;
        delete m;  // true
        typeof m; // "undefined"
 
     2. DontDelete 就是一个特殊的标记,用来表明某一个属性能否被删除。需要注意的是一些内建的对象是自动持有这个标记的,从而不能被删除,比如函数内的arguments,以及函数的length属性。
     3. 函数的形参同同样带有 DontDelete 属性。
 
总结:

     1. 变量和函数的声明实际上都会成为全局对象或者当前函数活动对象的属性。
     2. 属性都有一个DontDelete标记,用于表明该属性是否能被delete。

     3. 通过变量声明和函数声明创建的属性都会带有DontDelete标记。
     4. 函数内建的arguments对象作为该函数活动对象的默认属性,创建时总会带有DontDelete标记。
     5. 函数的形参带有DontDelete标记。 
     6. 在eval代码块中声明的变量和方法都不带有DontDelete标记。
     7. 对还不存在的变量或属性的直接赋值产生的对象不会带有任何标记,包括DontDelete。比如某个对象增加一个属性或者方法可以用 delete 删除。
     8. 如果能用 delete 删除,返回 true , 否则返回 false;
总之,delete只能删除对象的属性?
posted @ 2015-04-27 10:50  Bestend  阅读(462)  评论(0编辑  收藏  举报