javascript 中的 delete

那么,为什么我们能删除一个对象的属性:

var x = { a: 1 };
delete x.a; // true
x.a; // undefined

但却不能删除一个变量:

var x = 1;
delete x; // false;
x; // 1

也不能删除一个函数:

function x() {};
delete x; // false;
typeof x; // "function"
  • 注意:delete 只有当一个属性无法被删除时才返回 false。
  • 每一个属性拥有零至多个如内部属性——*ReadOnly,DontEnum,DontDelete和Internal**。 你可以把它们想象为标签——一个属性可能拥有也可能没有某个特殊的内部属性。 在今天的讨论中,我们所感兴趣的是 DontDelete。
  • 当声明变量和函数时,它们成为了变量对象(Variable object)——要么是活化对象(在函数代码中), 要么是全局对象(在全局代码中)——的属性,这些属性伴随生成了内部属性 DontDelete。 然而,任何显式/隐式赋值的属性不生成 DontDelete。 而这就是本质上为什么我们能删除一些属性而不能删除其他的原因。
var GLOBAL_OBJECT = this;

/* ‘foo‘是全局对象的一个属性,
    它通过变量声明而生成,因此拥有内部属性DontDelete
    这就是为什么它不能被删除*/
var foo = 1;
delete foo; // false
typeof foo; // "number"

/* ‘bar‘是全局对象的一个属性,
    它通过变量声明而生成,因此拥有DontDelete子
    这就是为什么它同样不能被删除*/
function bar() {};
delete bar; // false
typeof bar; // "function"

/* ‘baz‘也是全局对象的一个属性,
    然而,它通过属性赋值而生成,因此没有DontDelete
    这就是为什么它可以被删除*/
GLOBAL_OBJECT.baz = "baz";
delete GLOBAL_OBJECT.baz; // true
typeof GLOBAL_OBJECT.baz; // "undefined"

1.5、内建和DontDelete | Build-ins and DontDelete

所以这就是所有这一切发生的原因:属性的一个特殊的内部属性控制着该属性是否可以被删除。 注意:内建对象的一些属性拥有内部属性 DontDelete,因此不能被删除; 特殊的 arguments 变量(如我们所知的,活化对象的属性)拥有 DontDelete; 任何函数实例的 length (返回形参长度)属性也拥有 DontDelete:

(function() {
    //不能删除‘arguments‘,因为有DontDelete
    delete arguments; // false;
    typeof arguments; // "object"

    //也不能删除函数的length,因为有DontDelete
    function f() {};
    delete f.length; // false;
    typeof f.length; // "number"
}) ();

与函数 arguments 相关联的属性也拥有 DontDelete,同样不能被删除

(function(foo,bar) {
    delete foo; // false
    foo; // 1

    delete bar; // false
    bar; // "bah"
}) (1,"bah");

1.6、未声明的变量赋值 | Undeclared assignments

  • 你可能记得,未声明的变量赋值会成为全局对象的属性,除非这一属性在作用域链内的其他地方被找到。 而现在我们了解了属性赋值和变量声明的区别——后者生成 DontDelete 而前者不生成——这也就是为什么未声明的变量赋值可以被删除的原因了。
var GLOBAL_OBJECT = this;

/* 通过变量声明生成全局对象的属性,拥有DontDelete */
var foo = 1;

/* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */
bar = 2;

delete foo; // false
delete bar; // true

注意:内部属性是在属性生成时确定的,之后的赋值过程不会改变已有的属性的内部属性。 理解这一区别是重要的。

/* ‘foo‘创建的同时生成DontDelete */
function foo() {};

/* 之后的赋值过程不改变已有属性的内部属性,DontDelete仍然存在 */
foo = 1;
delete foo; // false;
typeof foo; // "number"

/* 但赋值一个不存在的属性时,创建了一个没有内部属性的属性,因此没有DontDelete */
this.bar = 1;
delete bar; // true;
typeof bar; // "undefined"

总结:
  • 变量和函数声明都是活化(Activation)全局(Global)对象的属性。
  • 属性拥有内部属性,其中一个—— DontDelete 负责确定一个属性是否能够被删除。
  • 全局代码或函数代码中的变量、函数声明都生成拥有 DontDelete 的属性。
  • 函数参数同样是活化对象的属性,也拥有 DontDelete。
  • 删除对象中的属性:delete 对象.成员

    只能删除自有的成员

    只有var声明的全局变量不让delete

    使用window.或window[""]增加的全局成员可以delete

时间: 2025-01-05 04:39:02

javascript 中的 delete的相关文章

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 也不能删除像这样定义的函数: 复制

深入理解javascript 中的 delete(转)

在这篇文章中作者从<JavaScript面向对象编程指南>一书中关于 delete 的错误讲起,详细讲述了关于 delete 操作的实现, 局限以及在不同浏览器和插件(这里指 firebug)中的表现. 下面翻译其中的主要部分. ...书中声称 “函数就像一个普通的变量那样——可以拷贝到不同变量,甚至被删除” 并附上了下面的代码片段作为说明: >>> var sum = function(a, b) {return a+b;}; >>> var add =

关于JavaScript中的delete操作

关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我选了Error....,然而是错的,运行了一下,答案是1. 难道不能delete函数中的参数吗?什么情况是可以delete的?什么情况是不可以delete的? 去网上查了一下 通常:delete 操作符用来删除一个对象的属性. 语法:delete expression 如果成功返回true,失败返回

JS中的delete操作符

首先,delete删除成功返回true,失败返回false. js代码: function wxCount ($element) { this.init($element); } wxCount.prototype = { init : function(){...}, //初始化方法 count : function(){...}, //计算方法 destroy : function(){ delete this; } //删除方法 } 仔细一看便知,这里的this指向的是function w

JavaScript中Delete函数

JavaScript中Delete函数是删除指定的文件或文件夹. object.Delete( force ); 其中object是必选项. 应为 File 或 Folder 对象的名称. force是可选项. Boolean 值,如果要删除设置了只读属性的文件或文件夹则为 True ;否则为 False (默认). 并且如果指定的文件或文件夹不存在,那么会产生一个错误.http://www.mlybyby.com JavaScript中Delete函数对于单个 File 或 Folder 产生

javascript 中delete 的作用是干啥的

js中的delete 跟 c,c++中的delete意思不一样, js中的delete只是删除对象的属性,但是该属性所指向的对象并不会被删除掉 var person = {}; var body = {"head":"one big head", hand = "two"}; person.body = body; delete person.body person的body属性被删除,但是body这个对象还存在,body对象会由于失去了引用而被

JavaScript中堆栈解析,已经与delete之间的关系。

1,在栈中的数据不会随意删除. 2,堆中的数据可以随意删除. 注意:用eval("var a")定义的变量存放在栈中. var 和function 语句在JavaScript中的优先级很高,需要预执行. 预执行就是因为需要计算作用域中局部变量指针所占空间的大小,从而给他们分配内存. 栈中的东西是不能随意删除的,所以我们无法删除这些变量. 但是某些情况下变量也可以放在堆中,比如使用eval执行var语句在运行过程中动态定义变量. 由于栈空间的计算在作用域运行前就计算好的,运行过程中动态定

【转】十个JavaScript中易犯的小错误,你中了几枪?

在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有经验的工程师,或者甚至是初学者而言,实现基本的js功能几乎毫无障碍.但是JS的真实功能却比很多人想象的要更加多样.复杂.JavaScript的许多细节规定会让你的网页出现很多意想不到的bug,搞懂这些bug,对于成为一位有经验的JS开发者很重要. 常见错误一:对于this关键词的不正确引用 我曾经听一位喜

【转载】在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别

原文链接:http://www.2cto.com/kf/201204/128406.html[侵删] Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的 Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. var num = 1: 是在当前域中声明变量. 如果在方法中声明,则为局部变量(local var