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