delete
操作符来删除一个隐式声明的全局变量,也就是没有使用 var
定义的全局变量.
如果 delete
操作符删除成功, 则被delete的属性已从所属的对象上彻底消失, 随后,该对象的原型上可能存在的一个同名属性会被继承.
一些对象的属性不能被delete. ECMA 262 规范中把这些属性标记为 DontDelete.
x = 42; // 隐式声明的全局变量
var y = 43; // 显式声明的全局变量
myobj = new Number();
myobj.h = 4; // 添加属性h
myobj.k = 5; // 添加属性k
delete x; // 返回 true (隐式声明的全局变量可以被删除)
delete y; // 返回 false (显式声明的全局变量不能被删除,该属性有DontDelete标记)
delete Math.PI; // 返回 false (内置对象的内置属性不能被删除, 该属性有DontDelete标记)
delete myobj.h; // 返回 true (用户定义的属性可以被删除)
with(myobj) {
delete k; // 返回 true (相当于delete myobj.k)
}
delete myobj; // 返回 true (隐式声明的全局变量可以被删除)
你不能删除一个对象从原型继承而来的属性(不过你可以从原型上直接删掉它).
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
delete foo.bar; // 无效的操作
alert(foo.bar); // alerts 42, 继承的属性
delete Foo.prototype.bar; // 直接删除原型上的属性
alert(foo.bar); // alerts "undefined",已经没有继承的属性
当你删除一个数组元素时,数组的length属性并不会变小. 当用delete
操作符删除一个数组元素时,被删除的元素已经完全不属于该数组.
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
// 不会执行到这里
}
undefined给其
赋值而不是使用delete操作符.
var trees = ["redwood","bay","cedar","oak","maple"];
trees[3]=undefined;
if (3 in trees) {
// 会执行到这里
}