时间:2021-05-26
那么,为什么我们能删除一个对象的属性:
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;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 而前者不生成——这也就是为什么未声明的变量赋值可以被删除的原因了。
注意:内部属性是在属性生成时确定的,之后的赋值过程不会改变已有的属性的内部属性。 理解这一区别是重要的。
function foo() {};foo = 1;delete foo; // false;typeof foo; // "number"this.bar = 1;delete bar; // true;typeof bar; // "undefined"总结:
变量和函数声明都是活化(Activation)全局(Global)对象的属性。
属性拥有内部属性,其中一个—— DontDelete 负责确定一个属性是否能够被删除。
全局代码或函数代码中的变量、函数声明都生成拥有 DontDelete 的属性。
函数参数同样是活化对象的属性,也拥有 DontDelete。
删除对象中的属性:delete 对象.成员
只能删除自有的成员
只有var声明的全局变量不让delete
使用window.或window[""]增加的全局成员可以delete
ps:Javascript中delete运算符
Delete是Javascript语言中使用频率较低的操作之一,但是有些时候,当我们需要做delete或者清空动作时,就需要delete操作。在这篇文章中,我们将深入探讨如何使用它,以及它是如何工作的。
删除的目的,如你所想,就是要删除某些东西,更具体的说,它会删除对象的属性,如下例:
var Benjamin = { "name": "zuojj", "url" : "http://" }console.log(benjamin);同时,像in和for in 循环运算将不会报告null属性的存在,如果你使用个对象,可能使用这些方法来检查一个对象,你可能想确保你真正删除任何不需要的属性。
最后,你应该记住,删除并没有破坏属性的值,仅仅属性本身,看下面的例子:
var name = "zuojj", benjamin = {};benjamin.name = name;delete benjamin.name;//Outputs: "zuojj"console.log(name);这里,name和benjamin.name映射到相同的值,真如你所看到的,删除benjamin.name并不会影响name.
以上,就是我对delete运算符的概述,不妥之处,欢迎大家批评指正。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C++中new和delete的使用方法详解new和delete运算符用于动态分配和撤销内存的运算符new用法:1.开辟单变量地址空间1)newint;//开辟一
delete删除运算符释放内存块。语法[::]deletecast-expression[::]delete[]cast-expression备注cast-ex
C++支持使用new和delete运算符动态分配和释放对象。这些运算符为来自称为“自由存储”的池中的对象分配内存。new运算符调用特殊函数operatornew
一、一元运算符1、delete运算符:删除对以前定义的对象属性或方法的引用。例如:varo=newObject;o.name="superman";alert(
delete是一元操作符,它用来删除对象属性或者数组元素。就像赋值、递增、递减运算符一样,delete也是具有副作用的,它是用来做删除操作的,不是用来返回一个值