想了解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/

javascript delete机制学习的更多相关文章

  1. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  2. javascript继承机制的设计思想(ryf)

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  3. Javascript事件机制兼容性解决方案

    本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTag ...

  4. 从setTimeout谈JavaScript运行机制

    从setTimeout说起 众所周知,JavaScript是单线程的编程,什么是单线程,就是说同一时间JavaScript只能执行一段代码,如果这段代码要执行很长时间,那么之后的代码只能尽情地等待它执 ...

  5. 重温javascript事件机制

    以前用过一段时间的jquery感觉太方便,太强大了,各种动画效果,dom事件.创建节点.遍历.控件及UI库,应有尽有:开发文档也很多,网上讨论的问题更是甚多,种种迹象表明jquery是一个出色的jav ...

  6. javascript delete方法

    学习delete可以参考下面两个博客,写的都很好,本文大部分参考与以下两个博客 http://www.cnblogs.com/windows7/archive/2010/03/28/1698387.h ...

  7. 转:Javascript继承机制的设计思想

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  8. JavaScript 执行机制

    一.宏任务与微任务 macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTi ...

  9. 转载---JavaScript执行机制

    很好的一篇文章,原地址 JavaScript执行机制 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不 ...

随机推荐

  1. Exchange Server 2010/2013功能差异

  2. html5上传本地图片,在线预览及裁剪(filereader,canvas)

    1 我们常常需要上传头像,点击上传按钮时候需要预览一下,使用filereader方法无需和后台交互,代码如下: //本地图片在上传之前的预览效果 //图片上传预览 function previewIm ...

  3. poj 2441 Arrange the Bulls(状态压缩dp)

    Description Farmer Johnson's Bulls love playing basketball very much. But none of them would like to ...

  4. JavaScript 中的正常任务与微任务

    正常情况下,JavaScript的任务是同步执行的,即执行完前一个任务,然后执行后一个任务.只有遇到异步任务的情况下,执行顺序才会改变. 这时,需要区分两种任务:正常任务(task)与微任务(micr ...

  5. Struts2 页面url请求怎样找action

    1.我们使用最原始的方法去查找action.不同注解. struts.xml文件先配置 <!-- 新闻信息action --> <action name="newsInfo ...

  6. Pig系统分析(6)-从Physical Plan到MR Plan再到Hadoop Job

    从Physical Plan到Map-Reduce Plan 注:由于我们重点关注的是Pig On Spark针对RDD的运行计划,所以Pig物理运行计划之后的后端參考意义不大,这些部分主要分析流程, ...

  7. oracle之case when

    oracle case when 的用法 http://www.cnblogs.com/xiaowu/archive/2011/08/17/2143445.html(转) http://www.cnb ...

  8. C# 大小写转换

    全部大写: string upper = str.ToUpper() 全部小写: string lower = str.ToLower(); str是需要转换的字符.

  9. CSS transform(变形)和transform-origin(变形原点)

    transform(变形)和transform-origin(变形原点)的说明: 目前这两个属性得到了除去ie以外各个主流浏览器webkit,firefox,opera的支持,属性名分别为 -webk ...

  10. document 例子

    <!DOCTYPE html> <html> <head> <title></title> <script type="te ...