javascript的delete

简介:
刚刚拜读了  Javascript的变量与delete操作符  很受启发。原文只说了结果,没更深入推理总结一下为什么,以及怎么理解好一点,我这里补充总结一下。
/// <reference path="http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/" />
/*
与c++不同,javascript的delete不会删除属性所指向的对象
“删除属性而不是删除对象”这一点,可以通过以下的代码来确认。
*/
var o = {};
var a = { x: 10 };
o.a = a;
delete o.a;    // o.a属性被删除
o.a;           // undefined
a.x;           // 10, 因为{ x: 10 } 对象依然被 a 引用,所以不会被回收
/*
属性delete**结论:delete删除对象实例的属性 只对对象实例操作,不会影响到他的类型和原型
*/
function C() { this.x = 42; }     //构造函数。
C.prototype.x = 12;     //给o的原型对象添加属性x,所以不会被delete。
var o = new C(), d = new C();
alert(o.prototype);     //显示undefined,因为其实只有函数才有prototype属性
//alert(C.prototype.isPrototypeOf(o));
alert(o.x);     // 42, 构造函数中定义的o.x
delete o.x;     // delete删除属性 只对对象实例操作,不会影响到他的原型
alert(o.x);     // 12 在自身上找不到x,就会查找原型链。
alert(d.x);     // 42 因为只删了实例o的x属性,并没删实例d的x属性,这里不会显示undefined
/*
测试变量delete**结论:通过var声明的变量和通过function声明的函数拥有DontDelete特性,
无法被删除。如果你曾经用闭包模拟过类的私有属性、方法,那也可以这样理解,通过var和
function声明的变量和有名函数,都是可以看做类的私有的成员,私有成员具有DontDelete特性。
*/
var a = 1;
delete a;
b = 2;     //没有用var,可以理解默认为公有的属性,可以被删除
delete b;
alert(typeof b); //undefinded,被删了
function foo() {//全局对象的私有方法
return 42;
}
delete foo;
alert(foo());  // 42
function foo1() {
var local = 36;
delete local;    // 删除local,很显然local是私有成员,没删掉
alert(local);
}
foo1();
/*
eval和delete**结论:eval比较特殊,参考
http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/#content_2_4
*/
eval("var x = 36;");     //注意:eval受作用域影响,更多参考http://www.cnblogs.com/kaima/archive/2009/03/11/1408748.html
alert(x);     // 36
delete x;
alert(typeof x);     // undefined,被删了。
/*
delete是普通运算符,会返回true或false。规则为:当被delete的对象的属性存在并且拥有
DontDelete时返回false,否则返回true。这里的一个特点就是,对象属性不存在时也返回
true,所以返回值并非完全等同于删除成功与否。

*/


本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/archive/2009/03/19/1417040.html,如需转载请自行联系原作者。

目录
相关文章
|
JavaScript 前端开发
JavaScript 变量不能被 delete 的原因
JavaScript 变量不能被 delete 的原因
220 0
|
Web App开发 JavaScript 前端开发
|
前端开发 JavaScript
Javascript中的delete
一、问题的提出 我们先来看看下面几段代码,要注意的是,以下代码不要在浏览器的开发者工具(如FireBug、Chrome Developer tool)中运行,原因后面会说明: 为什么我们可以删除对象的属性:  var o = { x: 1 }; delete o.
746 0
|
JavaScript 前端开发
Javascript 中的 in, hasOwnProperty, delete, for/in
in 运算符 判断对象是否拥有某一属性只要对象拥有该属性,就会返回true,否则false var point = { x:1, y:1 };alert( 'x' in point );  //true var arr = ['one', 'two'];alert( 'kang' in arr...
913 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
93 2
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
114 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
80 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
71 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
92 4