未加星标

Javascript中的delete操作符

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
变量

说到javascript中的delete操作符,还是首先要搞清楚javascript中的变量和属性之间的关系。

javascript中,变量和对象属性关系非常微妙,甚至可以很多时候会被等同起来,因为 javascript 在执行脚本之前会创建一个Global对象,在浏览器中就是window对象,所有的全局变量都是这个Global对象的属性,执行函数时也会创建一个Activation对象,所有的局部变量都是这个Activation对象的属性。这些可以大家可以去了解一下javascript作用域和闭包。

1 var global = 1; 2 this .global; // 1, 可以通过this来访问Global对象 3 this .global2 = 2; 4 global2; // 12 5 function foo() { 6 var local = 36; 7 // 不过无法直接访问Activation, 8 // 因此无法通过 foo.local 的方式来访问local变量 9 }

似乎变量就等同于对象属性,其实不然,至少对于delete操作符来说还是不一样的。我的理解是变量声明是必须通过 var 语句来完成的,未通过var 语句声明的全局变量都是都是window对象的属性。这样就很容易的理解变量和对象属性的关系了。

delete操作符

delete操作符是用来删除对象属性的。对于引用类型的值,它也是删除对象属性的本身,不会删除属性 指向的对象。如果有疑问可以看看基本类型和引用类型的值,或者测试下面的代码:

1 var o = {}; 2 var a = { x: 10 }; 3 o.a = a; 4 delete o.a; // o.a属性被删除 5 console.log(o.a); // undefined 6 console.log(a.x); // 10, 因为{ x: 10 } 对象依然被 a 引用,所以不会被回收

变量是不能删除的

通过var声明的变量和通过function声明的函数拥有DontDelete特性,是不能被删除。未通过var声明的全局变量(全局对象的属性)

01 var global = { 02 a: 123, 03 b: { 04 c: 1345 05 } 06 }; 07 delete global; //无效 08 console.log(global)

09

10 obj = { 11 a: 123 12 }; 13 delete obj; // 删除obj全局变量,window对象的obj属性 14 console.log(obj); //obj is not defined 原型中声明的属性和对象自带的属性无法被删除

原型prototype中声明的属性和对象自带的属性(其实这些属性也是在原型prototype中的)可以认为是带有DontDelete的特性的,无法被删除。例如

//原型中声明的属性无法被删除

function Obj() { this.x = 1; }

Obj.prototype.x = 2;

var o = new Obj();

console.log(o.x); // 1, 构造函数中定义的o.x

delete o.x;

console.log(o.x); // 2, prototype中定义的o.x,即使再次执行delete o.x也不会被删除

//对象自带的属性无法被删除

var strings="123456";

console.log(strings.length);//6

delete strings.length;

console.log(strings.length);//依然是6

eval语句下的几个例外

eval执行的代码中,通过var声明的变量虽然与正常的var声明变量同属于Global对象,但它们不具有DontDelete特性,能被删除。但是eval的代码中的函数内通过var定义的变量具有DontDelete,不能被删除。

eval("var x = 42;");

x; // => 42

delete x;

x; // => ReferenceError: x is not defined

eval("function f() { return 12; }");

f(); // => 12

delete f;

f(); // => ReferenceError: f is not defined

//eval执行的代码中,通过var声明的变量虽然与正常的var声明变量同属于Global对象,

// 但它们不具有DontDelete特性,能被删除。

eval("(function () {" +

" var x = 42;" +

" delete x;" +

" return x;" +

"})();")

// => 42

// eval的代码中的函数内通过var定义的变量具有DontDelete,不能被删除。

delete的返回值

delete是普通运算符,会返回true或false。当被delete的对象的属性存在并且拥有DontDelete时 返回false,否则返回true。 这里的一个特点就是,对象属性不存在时也返回true,所以返回值并非完全等同于删除成功与否。

function C() { this.x = 42; }

C.prototype.y = 12;

var o = new C();

delete o.x; // true

o.x; // undefined

"x" in o; // false

// o.x存在并且没有DontDelete,返回true

delete o.y; // true

o.y; // 12

// o自身没有o.y属性,所以返回true

// 从这里也可以看到prototype链的存在,对象自身属性和prototype属性是不同的

delete o; // false

// Global.o拥有DontDelete特性所以返回false

delete undefinedProperty; // true

// Global没有名为undefinedProperty的属性因此返回true

delete 42; // true

// 42不是属性所以返回true。有的实现会抛出异常(违反ECMAScript标准)

var x = 24;

delete x++; // true

x; // 25

// 被删除的是x++的返回值(24),不是属性,所以返回true

参考来源:

http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/

http://nanto.asablo.jp/blog/2008/01/09/2552470

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

分页:12
转载请注明
本文标题:Javascript中的delete操作符
本站链接:http://www.codesec.net/view/481752.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(17)