JavaScript中的delete运算符

一. delete概述

先看下面的一些delete的操作:

//删除全局变量
str = "nihao";
console.log(delete str); //true
console.log(str);  //报错

//删除对象成员
var obj = {
    name: 'lihua',
    age: 33
};
console.log(delete obj.name); //true
console.log(obj.name); //undefined

//删除数组元素
var array = [1, 2, 3,4];
console.log(delete array[2]); //true
console.log(array[2]); //undefined

//删除var声明变量
var hello = "nihao";
console.log(delete hello); //false
console.log(hello); //nihao

由上面的输出可以得出结论,delete运算符可以删除全局变量,数组元素,对象成员,不能删除var声明的变量和对象。

二. delete删除继承自原型的成员

(1)删除自身的成员

function Person(){
    this.name = "李明";
}
var p = new Person();
console.log(p); //Person {name: "李明"}
delete p.name;
console.log(p.name); //undefined
console.log(p); //Person {}

可以看出成功删除了Person构造函数的实例p的成员。

(2)删除继承自原型的成员

function Person(){
    this.name = "李明";
}
Person.prototype.age = 22;

function Student(){
}
Student.prototype = new Person();
Student.prototype.score = 99;

var p = new Person();
console.log(delete p.age);  //true
console.log(p.age); //22

var s = new Student();
console.log(delete s.name);  //true
console.log(delete s.score); //true
console.log(delete s.age); //true

console.log(s.name); //李明
console.log(s.age); //22
console.log(s.score); //99

由上述的输出可以看出,delete不能删除继承自原型的成员,也不能删除继承自原型的成员。

由上述的两个输出可以看出,delete运算符可以删除对象的实例中的成员,但是不能删除继承自原型的成员

如果非要删除继承自原型的成员,可以让实例指向原型对象,然后去删除原型对象中的成员,这样一来会影响到继承自这个构造函数或者由这个构造函数实例化出来的所有对象。如下:

var p1 = new Person();
var p2 = new Person();
var s = new Student();

console.log(delete p.constructor.prototype.age);  //true
console.log(p1.age);  //undefined
console.log(p2.age); //undefined
console.log(s.age); //undefined

可以看出,每个实例的原型链共同经过的原型对象中的成员改变,每个实例都会受到影响。

在上面的代码中,如果要删除s的name成员:

console.log(delete s.constructor.prototype.name);  //true
console.log(s.name); //李明

可以看出并没有成功删除,因为s.consturctor所指的构造函数是Person,并不是Student,所以应该是:

console.log(delete s.__proto__.name); //true
console.log(s.name); //undefined

由代码可以看出,不管成员删除是否成功都会返回true,查资料说只有在删除一些不能删除的成员时才会返回false,比如Function对象的length
,arguments等属性时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值