javascript的delete

刚刚拜读了 Javascript的变量与delete操作符  很受启发。原文只说了结果,没更深入推理总结一下为什么,以及怎么理解好一点,我这里补充总结一下。

 

  1. /// <reference path="http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/" />   
  2. /*  
  3. 与c++不同,javascript的delete不会删除属性所指向的对象  
  4. “删除属性而不是删除对象”这一点,可以通过以下的代码来确认。  
  5. */   
  6. var  o = {};  
  7. var  a = { x: 10 };  
  8. o.a = a;  
  9. delete  o.a;     // o.a属性被删除   
  10. o.a;           // undefined   
  11. a.x;           // 10, 因为{ x: 10 } 对象依然被 a 引用,所以不会被回收   
  12. /*  
  13. 属性delete**结论:delete删除对象实例的属性 只对对象实例操作,不会影响到他的类型和原型  
  14. */   
  15. function  C() {  this .x = 42; }      //构造函数。   
  16. C.prototype.x = 12;     //给o的原型对象添加属性x,所以不会被delete。   
  17. var  o =  new  C(), d =  new  C();  
  18. alert(o.prototype);     //显示undefined,因为其实只有函数才有prototype属性   
  19. //alert(C.prototype.isPrototypeOf(o));   
  20. alert(o.x);     // 42, 构造函数中定义的o.x   
  21. delete  o.x;      // delete删除属性 只对对象实例操作,不会影响到他的原型   
  22. alert(o.x);     // 12 在自身上找不到x,就会查找原型链。   
  23. alert(d.x);     // 42 因为只删了实例o的x属性,并没删实例d的x属性,这里不会显示undefined   
  24. /*  
  25. 测试变量delete**结论:通过var声明的变量和通过function声明的函数拥有DontDelete特性,  
  26. 无法被删除。如果你曾经用闭包模拟过类的私有属性、方法,那也可以这样理解,通过var和  
  27. function声明的变量和有名函数,都是可以看做类的私有的成员,私有成员具有DontDelete特性。  
  28. */   
  29. var  a = 1;  
  30. delete  a;  
  31. b = 2;     //没有用var,可以理解默认为公有的属性,可以被删除   
  32. delete  b;  
  33. alert(typeof  b);  //undefinded,被删了   
  34. function  foo() { //全局对象的私有方法   
  35. return  42;  
  36. }  
  37. delete  foo;  
  38. alert(foo());  // 42   
  39. function  foo1() {  
  40. var  local = 36;  
  41. delete  local;     // 删除local,很显然local是私有成员,没删掉   
  42. alert(local);  
  43. }  
  44. foo1();  
  45. /*  
  46. eval和delete**结论:eval比较特殊,参考  
  47. http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/#content_2_4  
  48. */   
  49. eval("var x = 36;" );      //注意:eval受作用域影响,更多参考http://www.cnblogs.com/kaima/archive/2009/03/11/1408748.html   
  50. alert(x);     // 36   
  51. delete  x;  
  52. alert(typeof  x);      // undefined,被删了。   
  53. /*  
  54. delete是普通运算符,会返回true或false。规则为:当被delete的对象的属性存在并且拥有  
  55. DontDelete时返回false,否则返回true。这里的一个特点就是,对象属性不存在时也返回  
  56. true,所以返回值并非完全等同于删除成功与否。  
  57. */   

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值