属性为何不能delete掉?

之前看书的时候,看到通过var声明的全局变量不可以通过delete操作符删除。

然后,why?

How can I remember that?

so,I found some words;

首先,要了解window对象

window对象是BOM的核心。

那何为BOM?

  bom,全称浏览器对象模型。他是操纵浏览器对象的,所以它提供了很多对象,用来访问浏览器的功能。查看高级程序设计的目录,BOM的二级目录有下面几个:

  window对象,location对象,navigator对象,screen对象,history对象。

window对象就是我们的全局作用域,任何在全局作用域声明的变量和函数,都会变成window对象的属性和方法。

  我们平时写的function 声明,也是同样建立window对象下:

  

var age = 10;
    function sayAge(){
        alert(this.age)
        console.log(this)
    }
    window.age // 10
    sayAge()   // 10

使用var 声明的全局变量无法用delete操作符删除。 通过var声明的变量和通过function声明的函数拥有DontDelete特性,无法被删除。

全局或者函数代码中的变量和函数声明总是创建带有 DontDelete 特性的属性。

  上面这句注意这几点:

  • 全局作用域或者函数代码中通过var或者function声明的,无法用delete删除,也就是带有名为[[Configurable]]的特性。参考高级程序设计P194;
  • 单纯的eval中声明的变量或函数,可以删除
  • 如果是在eval里面的函数中声明的,不可以删除。参考第一条,第一条的优先级最高。

    优先级:全局作用域/函数代码 > eval 。归根结底,就是第一条,在全局作用域或者函数代码中通过var或者function声明的,无法用delete删除。

delete是普通运算符,会返回true或false。

  规则为:当被delete的对象的属性存在并且拥有DontDelete时 返回false,否则返回true。

if(属性存在 &&  拥有DontDelete)  return true;
  else  return false;

   这里的一个特点就是,对象属性不存在时也返回true,所以返回值并非完全等同于删除成功与否。

  所以,不要单纯的相信宿主对象对你造作的返回结果。

摘自:http://bubkoo.com/2014/01/23/deep-in-delete/

下面是对于 JavaScript 中 delete 操作是如何工作的简短的总结:

  • 变量和函数声明都是活化对象(Activation Object) 或全局对象(Global Object)的属性
  • 属性拥有内部属性,其中 DontDelete 这个内部属性负责确定一个属性是否能够被删除
  • 全局或者函数代码中的变量和函数声明总是创建带有 DontDelete 特性的属性
  • 函数参数总是活动对象的属性, 并且带有 DontDelete
  • 在 Eval 代码中声明的变量和函数总是创建不带 DontDelete 特性 的属性
  • 新的未声明的属性在生成时带空的内部属性,因此也不带 DontDelete 特性
  • 永远不要相信宿主对象对 delete 操作做出的反应
时间: 2024-10-21 07:05:09

属性为何不能delete掉?的相关文章

在dataguard备库上找回在主库上被错误的Drop/Truncate/Delete 掉的Table

前提: - Standby Database Must be in Flashback database mode. - Time at which Drop/Truncate/Delete Table happened should be within the db_flashback_retention_target and all the flashback and archive logs should be available     在dataguard备库上找回在主库上被错误的Dr

如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉 在STL中容器是智能的,可以在容器销毁时自动调用容器里对象的析构函数来销毁容器存储的对象. STL的容器虽然比较智能,但是没有智能到可以自动销毁new出来的指针对象. 所以在使用STL中的容器时,如果保存的是mew出来的对象的指针.如果在容器销毁之前没有把new出来的对象释放,会造成内存泄露. 解决方法版本一: 这种手工释放容器里new的对象不太可靠,菲异常安全的.如果在delete的时候爆出异常,那么还是会引起

C++ delete掉的是new出的堆区内存,无法delete掉栈区的内存

直接上代码感受一下: #include <iostream>using namespace std; int main(){ int a=3; int* p1=&a; int* p2=new int(8); cout<<a<<' '<<*p1<<' '<<p1<<' '<<*p2<<' '<<p2<<endl; delete p1; delete p2; cout&l

Effective STL 第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

STL中的容器相当"聪明",它们提供了迭代器,以便进行向后和向前的遍历(通过begin.end.rbegin等):它们告诉你所包含的元素类型(通过它们的value_type类型定义):在插入和删除的过程中,它们自己进行必要的内存管理:它们报告自己有多少对象,最多能容纳多少对象(分别通过size和max_size):当然,当它们自身被析构时,它们自动析构所包含的每个对象. 有了这么"聪明"的容器,许多程序员不再考虑自己做善后清理工作.更糟糕的是,他们认为,容器会考虑为

JavaScript delete用法,属性,特性,执行上下文,激活对象 综合篇

一.问题的提出 我们先来看看下面几段代码,要注意的是,以下代码不要在浏览器的开发者工具(如FireBug.Chrome Developer tool)中运行,原因后面会说明: 为什么我们可以删除对象的属性: var o = { x: 1 }; delete o.x; // true o.x; // undefined 但不以删除像这样声明的变量: var x = 1; delete x; // false x; // 1 也不能删除像这样定义的函数: function x(){} delete

揭秘DOM中data和nodeValue属性同步改变那些事

问题引发:最近在整理DOM系列的一些知识点,发现在DOM的某些接口API中,存在一些我想不通的现象.就随便举个例子吧:DOM文档模型中的文本节点,可以通过nodeValue或data属性访问文本节点的文本内容,而且在更新data的时候nodeValue也即时更新,反之亦然.不光是data或nodeVaulue有这种相互影响的关系,其他类型节点也有比如该改变document.title也会随之改变网页标题.当时想弄明白这在JS引擎中是怎么实现的,于是乎进行了以下分析:通过文本节点的原型链继承关系

JavaScript中对象的属性

原文:http://www.2ality.com/2012/10/javascript-properties.html JavaScript中有三种不同类型的属性:命名数据属性(named data properties),命名访问器属性(named accessor properties)以及内部属性(internal properties). 命名数据属性 这种属性就是我们通常所用的"普通"属性,它用来将一个字符串名称映射到某个值上.比如,下面的对象obj有一个名为字符串"

原生JS:delete、in、typeof、instanceof、void详解

delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript) delete delete 运算符用来删除对象的自有属性. 语法:delete expression expression 的计算结果应该是一个对象的属性引用,如果不是一个对象的属性引用,那么,delete不会起任何作用,直接返回true. 在严格模式中,如果属性

javascript中对象的属性的特性

enumberable: 表示是否能通过for-in循环返回属性.默认为true writable: 是否可以修改属性, 默认为true value: 包含这个属性的数据值.读取属性值时3,从这个属性读,写入属性时,把新值保存到这个位置.默认值为undefine. getter: 在读取属性时,调用的函数 setter: 在写入属性时调用的函数 特别注意:一旦调用了Object.defineProperty方法之后,那些未定义的特性值除了configurable为false之外,其他都为unde