内容目录
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
又继承了User
的name
属性。
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
删除了该属性)。
0 条评论
撰写评论