从字面上就可以知道,delete的基本功能就删除了,说仔细点,就是可以让一个属性从一个对象中完全消失。
Delete 属性
> var obj = { hello: 'world' };
> delete obj.hello
true
> obj.hello
undefined
如果你把一个属性设为undefined,这个属性是仍然存在于改对象中的,该对象仍然包含它的key值。
> var obj = { foo: 'a', bar: 'b' };
> obj.foo = undefined;
> Object.keys(obj)
[ 'foo', 'bar' ]
但是,如果使用delete,该属性就完全消失于该对象中了。
> var obj = { foo: 'a', bar: 'b' };
> delete obj.foo
true
> Object.keys(obj)
[ 'bar' ]
另外,delete只能删除一个对象的直接属性,那也就是说,并不能删除掉它继承的属性。
var proto = {foo:'a'};
var obj = Object(proto);//obj继承proto
> delete obj.foo
true //这里返回的依然是true
> obj.foo
'a' //没有影响
Delete的返回值
如果某属性是一个对象的自有属性,但是并不能被删除,delete操作返回false。
其它情况下都返回true。
var obj = {};
Object.defineProperty(obj, 'canBeDeleted', {
value: 123,
configurable: true
});
Object.defineProperty(obj, 'cannotBeDeleted', {
value: 456,
configurable: false
});
//obj定义了一个cannotBeDeleted属性,并且该属性不能被删除
> delete obj.cannotBeDeleted
false //所以返回false
//其它情况下都返回true
> delete obj.doesNotExist //删除一个不存在的属性
true
> delete obj.canBeDeleted
true
即使在没有任何改变的情况下,也是返回true。
> delete obj.toString
true
> obj.toString // still there
[Function: toString]