关于js中的delete操作符

  1. delete是什么
    delete是一个操作符,作用是删除对象上的某个属性。其作用区别于C/C++等语言中delete可以用来释放内存。
  2. 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; 删除成功
  1. 小练习
var xx = 1;
function x(){
    xxx = 1;
}
x();
console.log(delete xx); //?
console.log(delete xxx); //?

以上,请大神指点补充

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值