Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7202485
  • 博文数量: 510
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6836
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(510)

文章存档

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: LINUX

2014-06-06 12:34:37

习惯上看delete就是删除了闭包、对象等变量;所以初学者很容易误解,当不使用的变量时候直接delete,实际很多情况下是无效的,最终导致常见的的内存的泄露。

一、几个例子

点击(此处)折叠或打开

  1. var o ={};
  2. o.a = 2;
  3. delete o.a;
  4. console.log(o.a); 

 输出: undefined    //可删除

点击(此处)折叠或打开

  1. var a = 2;
  2. delete a;
  3. console.log(a)
 输出: 2   //不能删除


再来一个列子

点击(此处)折叠或打开

  1. function f(){
  2.         console.log("hello");
  3. }
  4. delete f;
  5. f();
 输出: hello  //不能删除

二、规定
按照定义,delete是从对象删除一个属性。具备dontdelete特性。以下几种情况不能删除。

1、通过var声明的变量
    如上示例

2、通过function声明的函数
      如上示例

3、原型中声明的属性

点击(此处)折叠或打开

  1. function OBJ() {

  2. }
  3. OBJ.prototype.a = 2

  4. var o = new OBJ()
  5. console.log(o.a);  //输出2

  6. delete o.a;
  7. console.log(o.a);  //输出2
4、对象自带的属性无法被删除

点击(此处)折叠或打开

  1. var str = "123456";
  2. console.log(str.length);//输出6
  3. delete str.length;
  4. console.log(str.length); //输出6


另外,delete 的不是指向的对象,只是属性(成员)的引用。不同于c++;
还有 delete会返回 true或者false,返回true表示可删除,false表示不能删除。

以上是4中常见情况,更详细可参考 博文  和  MDN文档delete

三、对象成员的操作属性
delete可删除对象成员,但也可通过设置操作属性来控制。在代码使用时可灵活设置。看下几个例子

点击(此处)折叠或打开

  1. var foo = { bar: 'baz' };
  2. Object.defineProperty(foo, "bar", { writable: false }); //设置只读

  3. foo.bar = 'boing'; // 异常
  4. console.log(foo.bar)   //输出  baz



点击(此处)折叠或打开

  1. var foo = { bar: 'baz' };
  2. Object.defineProperty(foo, "bar", { configurable: false });//设置不可删除
  3. console.log(foo.bar);  //输出 baz
  4. delete foo.bar;
  5. console.log(foo.bar)//输出 baz


阅读(3471) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~