当前位置: 首页 > 技术教程 > JavaScript delete操作符详解

JavaScript delete操作符详解

JavaScript中的delete是一个操作符(也是一个关键字),它可以用来删除对象中的指定属性,也可用于删除数组中的元素。

delete删除对象属性

var obj = { };
obj.x = 20;
obj.y = 10;

// 删除obj对象的属性x,obj不再具有x属性
delete obj.x;

运行代码

值得注意的是,JS中的delete只是删除对象的属性本身,而不是删除该属性的值。只不过在多数情况下,该属性的值会由于失去了引用,而被垃圾回收。

var obj = { };
obj.x = { name: "张三" };

// 删除obj对象的属性x,对象"张三"由于失去引用而被垃圾回收
delete obj.x;

var obj2 = new Object();
var obj3 = { name: "李四" };
obj2.x = obj3;

// 虽然删除了x属性,但由于还存在其他引用,对象"李四"不会被垃圾回收
delete obj2.x;

delete删除变量

由于在JS中,所有的全局变量都是全局对象window的属性,因此delete也可用于删除某些全局变量。关于JS变量的更多信息,请参考JavaScript变量详解

sitename = "张三"; //注意,这里没有var修饰符
delete sitename; // 删除成功

delete删除数组元素

此外delete也可用于移除数组中的元素,但并不会改变数组length属性的大小。

var array = [6, 7, 8];
//移除数组中的第2个元素
delete array[1];
// 由于js中数组的length属性不能真实反映数组中元素的个数
// 而是返回数组最大下标 + 1,因此length仍然为3
alert(array.length);


var array2 = ["welcome", "to", "code", "player"];
// 移除数组中的最后一个元素(第4个元素)
delete array2[3];
// 虽然移除了数组中的最后一个元素,但length属性并不会变小,因此仍然为4
alert(array2.length);

delete不是万能的

delete虽然可以删除对象的属性和数组中的元素,但delete也不是万能的。有许多属性都无法使用delete进行删除,这些属性具有DontDelete标记,无法被删除。

1、delete无法删除使用var修饰符声明的变量

var x = "张三";
delete x; //无法删除
alert(x);

function demo(){
	var y = 18;
	delete y;	//无法删除
	alert(y);
}
demo();

2、delete无法删除js内置对象的内置属性

delete Math.PI; //内置属性的内置变量无法被删除
alert(Math.PI); // 3.14159265……

Math.custom = "CodePlayer";
delete Math.custom;	//不是内置属性,可以被删除
alert(Math.custom); //undefined

3、delete无法通过实例变量删除原型上声明的属性

function User(){ };
User.prototype.name = "张三";	//原型上声明的属性

var u = new User();
delete u.name;	//无法被删除
alert(u.name); //张三

实际上delete能够删除对象u自身的name属性(如果有的话),删除之后,由于User的原型也有name属性,因此对象u又继承了Username属性。

delete也可以直接删除掉原型上的属性,从而「干掉」name属性。

function User(){ };
User.prototype.name = "张三";	//原型上声明的属性

var u = new User();
delete u.name;	//无法被删除
alert(u.name); //张三
delete User.prototype.name; //删除原型上的name属性
alert(u.name); //undefined

4、delete无法删除通过function声明的函数

function test(){
	return "CodePlayer";
}
delete test;	//无法删除
alert(test());	//CodePlayer

5、有些例外情况仍然可以被delete删除

在JavaScript的特殊情况下,即使符合上述某些无法删除的条件,delete仍然可以删除指定的属性。

eval()执行的js代码中,即使变量使用了var修饰符进行声明,仍然可以使用delete将其删除。这里也有个例外,那就是在eval()代码中函数内使用var声明的变量,也无法被删除。

eval("var age = 18;");
alert(age); // 18
delete age; // 可以删除
// alert(age); // undefined

// eval代码中函数内使用var声明的变量,也无法被删除
alert( eval("(function() { var site = 'CodePlayer'; delete site; return site; })();") ); // CodePlayer

delete的返回值

delete操作符是有返回值的,如果待删除的属性存在无法被删除,返回false,其他情况都返回true

也就是说,如果待删除的属性不存在,delete也会返回true,这意味着返回true并不完全等同于删除成功。不过,只要是返回true,则待删除的属性都已经不存在(如果不存在,本身就没有;如果存在,返回true,表明delete删除了该属性)。

13 0
我们认为: 用户的主要目的,是为了获取有用的信息,而不是来点击广告的。因此本站将竭力做好内容,并将广告和内容进行分离,确保所有广告不会影响到用户的正常阅读体验。用户仅凭个人意愿和兴趣爱好点击广告。
我们坚信:只有给用户带来价值,用户才会给我们以回报。
CodePlayer技术交流群1CodePlayer技术交流群1

帮朋友打一个硬广告:

P2P网贷系统(Java版本) 新年低价大促销,多年P2P技术积累,系统功能完善(可按需定制,可支持第三方存管、银行存管),架构稳定灵活、性能优异、二次开发快速简单。 另可提供二次开发、安装部署、售后维护、安全培训等一条龙服务。

外行看热闹,内行看门道。可以自信地认为,在系统设计上,比市面上的晓风、迪蒙、方维、绿麻雀、国融信、金和盛等P2P系统要好。
深圳地区支持自带技术人员现场考察源代码、了解主要技术架构,货比三家,再决定是否购买。

也可推荐他人购买,一旦完全成交,推荐人可获得实际售价 10% 的返现。
有意向者,详情请 点击这里 联系,工作时间立即回复。

JavaScript