jyzwf / blog

在Issues里记录技术得点滴
17 stars 3 forks source link

谈谈 delete #52

Open jyzwf opened 6 years ago

jyzwf commented 6 years ago

今天看到一个笔试题,如下:

   a = 1
   delete a
   console.log(typeof a)

  var b = 2
  delete b
  console.log(typeof b)

大家可以猜猜看结果是啥

我们先来看看 delete 的用法 根据 mdn上的描述:

delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放

语法啥的就自个去看吧,(就是不写唉,,,略略略)

现在我们来看看 delete 的注意点

光说不做假把式,我们来实际检测下

1

    var obj = {}
    delete obj.x    // true
    console.log(obj) //{}

确实如第一条所述

2

   var proto = {
       d1:2
   }

  var obj = Object.create(proto)
  obj.d1 = 3
  delete obj.d1  // true
  console.log(obj)

image

3

这里我们拿 1 来举例

    var obj1 = {}
    delete obj1   // false
    console.log(obj1) //{}    ------说明没有删除成功

   obj2 = {}
   delete obj2   // true
  console.log(obj2)  // 删除成功了,所以报错了

image

4

    let o={}
   delete o    // false

  const b = {}
  delete b    // false

5

    let obj = {}
   Object.defineProperty(obj,'x',{
      value:66,
    configurable:false
  })

  delete obj.x    // false

严格模式与非严格模式的对比

在严格模式下,如果对一个变量的 直接引用函数的参数 或者 函数名使用delete操作,将会抛出 语法错误(SyntaxError)

任何使用 var 声明的变量都会被标记为 不可设置

1

  "use strict"
   var obj = {}
  delete obj

image

2

'use strict'

var d = (function (x) {
    delete x
    var b = 23
    delete b
    return b
})(2)        // 同样报错

3

    'use strict'
   var d = function(){console.log(66)}
   delete d    // 报错

4

    'use strict'
    var t=6
   Object.getOwnPropertyDescriptor(window,'t')

image

静态属性

1, 內建静态属性

delete Math.PI  // false

所以不起作用

2. 自定义

var Person=function(){
}
Person.age = 555
delete Person.age    // true

删除数组元素

当用 delete 操作符删除一个数组元素时,被删除的元素已经不再属于该数组

    var ary= [1,2,3,4,5];
   delete ary[3];
   if (3 in ary) {
      // 这里不会执行
   }

image

经过上面的讲解,我们可以轻松解决开头的问题了^_^

ok ,撒花,完结,,溜了溜了~~