java 中delete_[Java教程]javascript 中的 delete

[Java教程]javascript 中的 delete

0 2015-11-15 13:00:30

那么,为什么我们能删除一个对象的属性:var x = { a: 1 };delete x.a; // truex.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; // falsetypeof foo; // "number"/* 'bar'是全局对象的一个属性, 它通过变量声明而生成,因此拥有DontDelete子 这就是为什么它同样不能被删除*/function bar() {};delete bar; // falsetypeof bar; // "function"/* 'baz'也是全局对象的一个属性, 然而,它通过属性赋值而生成,因此没有DontDelete 这就是为什么它可以被删除*/GLOBAL_OBJECT.baz = "baz";delete GLOBAL_OBJECT.baz; // truetypeof GLOBAL_OBJECT.baz; // "undefined"

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

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

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

bc91bb04e6e9c61e24c974e4440db8f2.gif

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

bc91bb04e6e9c61e24c974e4440db8f2.gif

1.6、未声明的变量赋值 | Undeclared assignments你可能记得,未声明的变量赋值会成为全局对象的属性,除非这一属性在作用域链内的其他地方被找到。 而现在我们了解了属性赋值和变量声明的区别——后者生成 DontDelete 而前者不生成——这也就是为什么未声明的变量赋值可以被删除的原因了。var GLOBAL_OBJECT = this;/* 通过变量声明生成全局对象的属性,拥有DontDelete */var foo = 1;/* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */bar = 2;delete foo; // falsedelete 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

本文网址:http://www.shaoqun.com/a/159392.html

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

JavaScript

0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值