想了解delete的机制缘起一个现象,我无法解释,也无法理解。

首先看一下下面这个例子:
var x = 1;
delete x; //false
然后我又执行了一次:
y = 2;
delete y; //true
看到上面的结果,我比较吃惊,为什么同样是删除,区别怎么这么大呢?进而我想学习和了解一下JS delete的机制。
 在MDN(Mozilla Developer Network)上看到下面一个例子
x = 42;         // creates the property x on the global object
var y = 43; // declares a new variable, y
myobj = {
h: 4,
k: 5
}; delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
delete Math.PI; // returns false (delete doesn't affect certain predefined properties)
delete myobj.h; // returns true (user-defined properties can be deleted) delete myobj; // returns true (myobj is a property of the global object, not a variable, so it can be deleted)
我们可以看出,delete元算符执行的结果要么是true,要么是false。那么什么时候返回true,什么时间返回false呢?
简单的总结了一句话:只要可以被删除,就会返回true(看起来像是一句废话,可能实际上也是一句废话)
 
此时我们要讨论的就是什么时候才能被删除?
 
总结上面的例子我们发现:
1.在global object上的属性可以被删除;
2.声明的变量不能被删除
3.未声明的全局变量可以被删除
4.内置对象的属性不能被删除
 
为什么会有这个结果?
要想知道原理,首先了解两个概念:上下文和属性特性。
 
1.上下文
我们知道每条语句在执行的时候,他都会处在一个环境中,这个环境就是这条语句的上下文环境。当一个函数执行时,会进入函数代码执行的上下文;全局代码执行时,会进入全局代码执行的上下文。每个执行上下文中都会存在一个内部的可变对象(variable object),当进入这个环境的时候,会实例化这个可变对象,然后声明的变量和方法,都会作为这个可变对象的属性。那么在上述所说到的两个执行环境就会实例化两种对象,全局对象(global object)和激活对象(activation object)。
2.属性特性
ECMAScript5中可以查询,设置这些特性。我们将存取器属性的getter,setter方法看成是属性的特性,同理,可以把数据属性的值看做属性的特性。所以可认为一个属性包含一个名字和4个特性(见下表)。 ECMACScript5定义了一个名为“属性描述符”的对象。这个对象代表那4个特性。通过Object.getOwnPropertyDescriptor(object, propertyname)可以获得某个对象特定属性的属性描述符。
特性名
说明
Configurable
设置属性是否可配置,即能否更改(包括名值)或者删除(delect)它,能否修改属性特性等等
Enumerable
设置属性是否可以枚举,即能否通过for-in循环返回
Writable
是否可写
Value
就是属性值,对象在读取属性值时就是从这个位置读取的.

这里delete会涉及到Configurable特性。可通过上述方法getOwnPropertyDescriptor简单判断是否可以delete。开始说的两个例子的结果如下:

var x = 1;
Object.getOwnPropertyDescriptor(window, 'x'); //configurable= false
delete x; //false
y = 2;
Object.getOwnPropertyDescriptor(window, 'y'); //configurable= true
delete y; //true
这里还需要交代的是,属性的特性是在创建的时候就确定的,赋值并不能改变它的特性,
function sum() {}
sum = 1;
Object.getOwnPropertyDescriptor(window, 'sum'); //configurable= false
delete sum; //false
但是可以通过这个方法定义的特性值Object.defineProperties(object, descriptors),
Object.defineProperties(window, {sum1:{value:1,configurable:true}});
Object.getOwnPropertyDescriptor(window, 'sum'); //configurable= true
delete sum1; //true
Object.defineProperties(window, {sum2:{value:1,configurable:false}});
Object.getOwnPropertyDescriptor(window, 'sum'); //configurable= false
delete sum2; //false
 
总结一下delete不能删除属性:
 
1.声明的变量(变量、函数、函数参数)不能删除;如:var x=1;
2.内置对象的属性不能删除;如:Math.PI
3.定义的变量属性的configurable值为false的,不能删除。
注意:IE6-8下delete window属性会报类型错误
 
 
参考文献:
http://blog.csdn.net/jiushuai/article/details/6020739
http://perfectionkills.com/understanding-delete/

最新文章

  1. springMvc 报错
  2. ktouch移动端事件库
  3. HDU 5344 MZL's xor (水题)
  4. Shell Scipt 命令行带参数,输出log
  5. 如何:对 Web 窗体使用路由
  6. PDO基本操作Mysql
  7. Windows,Mac与Linux哪个更适合开发者?
  8. 在vue项目中, mock数据
  9. netcore编程之后面对不习惯的xshell黑屏部署,是时候使用jenkins自动化发布工具了
  10. Beta阶段冲刺汇总(团队)
  11. ubuntu安装python3.6
  12. 20165321 测试-3-ch02
  13. Elasticsearch5.0 安装问题
  14. HDU 4649 Professor Tian(反状态压缩dp,概率)
  15. DBNavigator中把insert变为append
  16. BZOJ4513: [Sdoi2016]储能表(数位dp)
  17. Unity 2D游戏开发教程之使用脚本实现游戏逻辑
  18. sqlserver -- 学习笔记(二)“SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问”解决方法
  19. NormalMap & CubeMap
  20. 初学Direct X(10)—— D3D基础预备知识

热门文章

  1. WPF多线程问题
  2. json对象与字符串的相互转换,数组和字符串的转换
  3. [RxJS] Toggle A Stream On And Off With RxJS
  4. idmap_ad — Samba's idmap_ad Backend for Winbind《转载》
  5. 关于百度鹰眼中 xcode 7 编译报错问题
  6. Python爬虫——抓取糗百段子
  7. MFC的初始化过程和消息映射技术
  8. CSS注意事项
  9. MySQL错误Another MySQL daemon already running with the same unix socket
  10. [Mugeda HTML5技术教程之16]案例分析:制作跨屏互动游戏