skying8603 发表于 2013-1-26 13:32:31

javascript之delete的用法

在实际的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()方法,会依次打印4212
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()方法,会依次打印undefined14   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,所以返回值并非完全等同于删除成功与否
页: [1]
查看完整版本: javascript之delete的用法