习惯上看delete就是删除了闭包、对象等变量;所以初学者很容易误解,当不使用的变量时候直接delete,实际很多情况下是无效的,最终导致常见的的内存的泄露。
一、几个例子
-
var o ={};
-
o.a = 2;
-
delete o.a;
-
console.log(o.a);
-
输出: undefined //可删除
-
var a = 2;
-
delete a;
-
console.log(a);
输出: 2 //不能删除
再来一个列子
-
function f(){
-
console.log("hello");
-
}
-
delete f;
-
f();
输出: hello //不能删除
二、规定
按照定义,delete是从对象删除一个属性。具备
dontdelete特性。以下几种情况不能删除。
1、
通过var声明的变量
如上示例
2、通过function声明的函数
如上示例
3、原型中声明的属性
-
function OBJ() {
-
-
}
-
OBJ.prototype.a = 2;
-
-
var o = new OBJ();
-
console.log(o.a); //输出2
-
-
delete o.a;
-
console.log(o.a); //输出2
-
4、对象自带的属性无法被删除
-
var str = "123456";
-
console.log(str.length);//输出6
-
delete str.length;
-
console.log(str.length); //输出6
另外,delete 的不是指向的对象,只是属性(成员)的引用。不同于c++;
还有 delete会返回 true或者false,返回true表示可删除,false表示不能删除。
以上是4中常见情况,更详细可参考 博文 和 MDN文档delete
三、对象成员的操作属性
delete可删除对象成员,但也可通过设置操作属性来控制。在代码使用时可灵活设置。看下几个例子
-
var foo = { bar: 'baz' };
-
Object.defineProperty(foo, "bar", { writable: false }); //设置只读
-
-
foo.bar = 'boing'; // 异常
-
console.log(foo.bar) //输出 baz
-
-
var foo = { bar: 'baz' };
-
Object.defineProperty(foo, "bar", { configurable: false });//设置不可删除
-
console.log(foo.bar); //输出 baz
-
delete foo.bar;
-
console.log(foo.bar); //输出 baz
阅读(3517) | 评论(0) | 转发(0) |