1、删除对象属性
function fun(){
this.name = 'mm';
}
var obj = new fun();
console.log(obj.name); //mm
delete obj.name;
console.log(obj.name); //undefined
2、删除无var创建的隐式全局变量(无视是否在函数中创建)
// 定义全局变量
name = 'lily'; // "lily"
// 试图删除
delete name; // true
// 测试该删除
typeof name; // "undefined"
3、不能删除var创建的全局变量(任何函数之外的程序中创建)
// 定义全局变量
var name = 'lily'; // undefined
// 试图删除
delete name; // false
// 测试该删除
typeof name; // "string"
4、不能删除原型链中的变量
fun.prototype.age = 18;
delete obj.age;
console.log(obj.age) //18
上面的第2点和第3点的区别表明:
在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的。
与delete有关的问题
Q:下面代码输出什么?
var output = (function(x){
delete x;
return x;
})(0);
console.log(output);
A:
输出是 0。
delete 操作符是将object的属性删去的操作。但是这里的 x 是并不是对象的属性, delete 操作符并不能作用。
Q:下面代码输出什么?
var x = 1;
var output = (function(){
delete x;
return x;
})();
console.log(output);
A:
输出是 1。
delete 操作符是将object的属性删去的操作。但是这里的 x 是并不是对象的属性, delete 操作符并不能作用。
下面代码输出什么?
var x = { foo : 1};
var output = (function(){
delete x.foo;
return x.foo;
})();
console.log(output);
A:
输出是 undefined。
x虽然是全局变量,但是它是一个object。delete作用在x.foo上,成功的将x.foo删去。所以返回undefined
Q:下面代码输出什么?
var Employee = {
company: 'xyz'
}
var emp1 = Object.create(Employee);
delete emp1.company
console.log(emp1.company);
A:
输出是 xyz。
这里的 emp1 通过 prototype 继承了 Employee的 company。emp1自己并没有company属性。所以delete操作符的作用是无效的。