Javascript的变量与delete操作符(2)

来源:未知 责任编辑:责任编辑 发表时间:2013-12-01 14:20 点击:

delete o.x;
o.x;     // 12,  prototype中定义的o.x,即使再次执行delete o.x也不会被删除
对象的预定义属性也无法删除。 可以认为这类属性带有DontDelete的特性。
 
var re = /abc/i;
delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase无法删除
能删除的变量和不能删除的变量
通过var声明的变量和通过function声明的函数拥有DontDelete特性,无法被删除。
 
var x = 36;
delete x;
x;     // 36, x没有被删除
 
y = 12;
delete y;
y;     // undefined
 
function foo() { return 42; }
delete foo;
foo();  // 42
但是有一点例外,就是通过eval 执行的代码中,通过var声明的变量虽然与正常的var声明变量 同属于Global对象,但它们不具有DontDelete特性,能被删除。
 
eval("var x = 36;");
x;     // 42
delete x;
x;     // undefined
但是这也有一点例外,eval的代码中的函数内通过var定义的变量具有DontDelete,不能被删除。
 
eval("(function() { var x = 42; delete x; return x; })();");
// 返回42
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
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Gb2312转utf-8编码的方法(vbs+js)
  • 如何使用Ajax技术开发Web应用程序(1)
  • js跳转路径问题
  • JavaScript模仿桌面窗口
  • 用js检测两个线段是否相交
  • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
  • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
  • 我是如何去了解jquery的(六),案例之幻灯片轮换
  • Jquery封装幻灯片效果
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1