六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 45|回复: 0

javascript之delete的用法

[复制链接]

升级  14%

15

主题

15

主题

15

主题

秀才

Rank: 2

积分
71
 楼主| 发表于 2013-1-26 13:32:31 | 显示全部楼层 |阅读模式
在实际的Javascript中,delete o.x之后,Object对象会由于失去了引用而被垃圾回收,所以delete o.x也就“相当于”删除了o.x所指向的对象,但这个动作并不是ECMAScript标准,也就是说,即使某个实现完全不删除Object对象,也不算是违反ECMAScript标准。
1、js里的delete是指删除属性而不是删除对象
var o = {};var a = { x: 10 };o.a = a;delete o.a;    // o.a属性被删除o.a;           // undefineda.x;           // 10, 因为{ x: 10 } 对象依然被 a 引用,所以不会被回收
2、并不是所有的属性都能被delete,prototype中声明的属性就无法被delete以及var定义的属性也无法被删除
function D(){this.x=42}D.prototype.x = 12; function aa(){ var o = new D();  alert(o.x); delete o.x;  alert(o.x);}
调用  aa()方法,会依次打印42  12
3、通过function声明的函数都无法被删除,但在一个函数中定义一个作为该函数的属性函数则可以被删除
function C() {   this.B = function(){return 12;}   delete this.B; }function A(){   return 13;}function E() {    this.B = function(){return 14;}}function bb(){   var o = new C();    alert(o.B);   var e = new E();    alert(e.B());   delete A;   alert(A());} 调用bb()方法,会依次打印undefined  14   13
4、但是有一点例外,就是通过 eval 执行的代码中,通过var声明的变量虽然与正常的var声明变量同属于Global对象,但它们不具有DontDelete特性,能被删除
   eval("var x = 36;");   x;     // 42   delete x;   x;     // undefined
5、但是这也有一点例外,eval的代码中的函数内通过var定义的变量具有DontDelete,不能被删除。
eval("(function() { var x = 42; delete x; return x; })();");// 返回 42
6、delete是普通运算符,会返回true或false。规则为:当被delete的对象的属性存在并且拥有DontDelete时返回false,否则返回true。这里的一个特点就是,对象属性不存在时也返回true,所以返回值并非完全等同于删除成功与否
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表