- delete是什么
delete是一个操作符,作用是删除对象上的某个属性。其作用区别于C/C++等语言中delete可以用来释放内存。 - delete的使用
以下摘自MDN
基本语法:delete expression;
where expression should evaluate to a property reference, e.g.:
expression 这里应该是一个属性的引用。
返回值:true for all cases except when the property is an own non-configurable property, in which case, false is returned in non-strict mode.对于所有情况都是true,除非属性是一个自己的不可配置属性,在这种情况下,非严格模式返回 false。
下面上代码
//基本使用
var obj = {
name:'jack',
age:19,
address:'北京'
};
console.log(obj); //{name:'jack',age:19,address:'北京'}
var val = delete obj.age;
console.log(obj); //{name:'jack',address:'北京'}
console.log(val); //true
console.log(obj.mobile) //undefined
val = delete obj.mobile;
console.log(obj); //{name:'jack',address:'北京'}
console.log(val); //true,这里仍然返回true,strict模式下依然返回true
根据MDN的说明:If the property which you are trying to delete does not exist, delete will not have any effect and will return true
如果你尝试删除的属性不存在,delete不会产生任何影响,并且返回true。感觉有点诡异(-> v ->)
3. 注意事项
(1)关于不可配置属性
起初对于不可配置属性一无所知,看了MDN才有所了解,看来需要学习的还有很多。
//继续使用前面代码中的obj对象,先来把name定义为不可配置属性
Object.defineProperty(obj, 'name', {configurable: false});
console.log(delete obj.name); //false
//'use strict'模式下删除不可配置属性会报错
'use strict'
console.log(delete obj.name) //Uncaught TypeError: Cannot delete property 'name' of #<Object>
(2)不可删除变量
console.log(delete obj); //false,严格模式下直接报错
(3)原型链属性的删除
function student(){
this.name = 'tom';
this.age = 20;
}
student.prototype.sex = '男'; //定义在原型链上的属性
var st = new student(); //创建一个student对象
console.log(st.sex); //男
console.log(st.name); //tom
console.log(delete st.sex); //true
console.log(delete st.name); //true
console.log(st.sex); //男;删除失败,仍然可以访问到
console.log(st.name); //undefined;student实例上的属性删除成功
console.log(delete st.__proto__.sex); //通过原型链删除
console.log(st.sex); //undefined;删除成功
console.log(student.prototype.sex); //undefined; 删除成功
- 小练习
var xx = 1;
function x(){
xxx = 1;
}
x();
console.log(delete xx); //?
console.log(delete xxx); //?
以上,请大神指点补充