zoukankan      html  css  js  c++  java
  • javascript的delete

    刚刚拜读了 Javascript的变量与delete操作符 很受启发。原文只说了结果,没更深入推理总结一下为什么,以及怎么理解好一点,我这里补充总结一下。
    /// <reference path="http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/" />
    /*
    与c++不同,javascript的delete不会删除属性所指向的对象
    “删除属性而不是删除对象”这一点,可以通过以下的代码来确认。
    */
    var o = {};
    var a = { x: 10 };
    o.a = a;
    delete o.a;    // o.a属性被删除
    o.a;           // undefined
    a.x;           // 10, 因为{ x: 10 } 对象依然被 a 引用,所以不会被回收
    /*
    属性delete**结论:delete删除对象实例的属性 只对对象实例操作,不会影响到他的类型和原型
    */
    function C() { this.x = 42; }     //构造函数。
    C.prototype.x = 12;     //给o的原型对象添加属性x,所以不会被delete。
    var o = new C(), d = new C();
    alert(o.prototype);     //显示undefined,因为其实只有函数才有prototype属性
    //alert(C.prototype.isPrototypeOf(o));
    alert(o.x);     // 42, 构造函数中定义的o.x
    delete o.x;     // delete删除属性 只对对象实例操作,不会影响到他的原型
    alert(o.x);     // 12 在自身上找不到x,就会查找原型链。
    alert(d.x);     // 42 因为只删了实例o的x属性,并没删实例d的x属性,这里不会显示undefined
    /*
    测试变量delete**结论:通过var声明的变量和通过function声明的函数拥有DontDelete特性,
    无法被删除。如果你曾经用闭包模拟过类的私有属性、方法,那也可以这样理解,通过var和
    function声明的变量和有名函数,都是可以看做类的私有的成员,私有成员具有DontDelete特性。
    */
    var a = 1;
    delete a;
    b = 2;     //没有用var,可以理解默认为公有的属性,可以被删除
    delete b;
    alert(typeof b); //undefinded,被删了
    function foo() {//全局对象的私有方法
    return 42;
    }
    delete foo;
    alert(foo());  // 42
    function foo1() {
    var local = 36;
    delete local;    // 删除local,很显然local是私有成员,没删掉
    alert(local);
    }
    foo1();
    /*
    eval和delete**结论:eval比较特殊,参考
    http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/#content_2_4
    */
    eval("var x = 36;");     //注意:eval受作用域影响,更多参考http://www.cnblogs.com/kaima/archive/2009/03/11/1408748.html
    alert(x);     // 36
    delete x;
    alert(typeof x);     // undefined,被删了。
    /*
    delete是普通运算符,会返回true或false。规则为:当被delete的对象的属性存在并且拥有
    DontDelete时返回false,否则返回true。这里的一个特点就是,对象属性不存在时也返回
    true,所以返回值并非完全等同于删除成功与否。
    */
  • 相关阅读:
    CodeForces 659F Polycarp and Hay
    CodeForces 713C Sonya and Problem Wihtout a Legend
    CodeForces 712D Memory and Scores
    CodeForces 689E Mike and Geometry Problem
    CodeForces 675D Tree Construction
    CodeForces 671A Recycling Bottles
    CodeForces 667C Reberland Linguistics
    CodeForces 672D Robin Hood
    CodeForces 675E Trains and Statistic
    CodeForces 676D Theseus and labyrinth
  • 原文地址:https://www.cnblogs.com/kaima/p/1417040.html
Copyright © 2011-2022 走看看