刚刚拜读了 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,所以返回值并非完全等同于删除成功与否。
- */