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也可用于删除某些全局变量。

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删除了该属性)。


赞(52) 打赏
未经允许不得转载:优客志 » 前端设计
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏