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]