likes
comments
collection
share

JavaScript 你所不知道的delete

作者站长头像
站长
· 阅读数 39

前言

delete

delete是一个语法关键词,它的语意是用来删除属性或者方法,但是关于delete其实也有一些隐性规则在里面

严格/非严格模式下的删除局部变量

首先是非严格模式下,尝试删除对象和删除对象属性

obj = {name: 'Bruse'}  // 输出{name: 'Bruse'}
delete obj.name  // 返回true
console.log(obj) // 输出{}

delete obj // 返回true
console.log(obj) // 抛出异常 obj is not defined

严格模式下,则只能删除对象的属性,并不能删除对象这个局部变量

obj = {name: 'Bruse'}  // 输出{name: 'Bruse'}
delete obj.name // 返回true
console.log(obj) // 输出{}

console.log(delete obj)  //抛出异常 SyntaxError... Deleting local variable in strict mode
console.log(obj)

同理,定义别的类型的局部变量也是如此

非严格模式可以删除局部变量

num = 123  // 输出123
delete num // 返回true, num is not defined

numArr = [1,2,3,4] // 输出[1, 2, 3, 4]
delete numArr  // 返回true, numArr is not defined

严格模式则无法删除局部变量

num = 13
delete (num) // 抛出异常SyntaxError... Deleting local variable in strict mode

numArr = [1, 2, 3, 4]
delete numArr  // 抛出异常SyntaxError... Deleting local variable in strict mode

var/let/const无法删除

var声明的属性,不能从全局作用域或者函数的作用域删除

letconst声明的属性,不能从它声明的作用域删除

let num = 80
delete num  // 返回false

var num = 19
delete num // 返回false

const num = 200
delete num // 返回false

delete返回值

delete执行会返回true/false返回false表示删除不成功,而返回true也不一定成功,仅是代表删除没有发生异常而已

delete b // 返回true

非严格模式,删除一个未声明的变量bdelete会返回true,仅表示删除变量b这个过程没有发生异常

let obj = {
    say(){}
}
delete obj.say     // 删除方法,返回true
console.log(obj.say) // 输出undefined

当删除objsay方法时,返回true,并且删除后obj没有了say方法

let obj = {
    say(){}
}
delete obj.toString  // 删除原型上的方法,返回true
console.log(obj.toString)  // 输出 ƒ toString() { [native code] }

而当删除对象原型上的方法时,虽然delete也返回true,但是并不表示成功删除toString方法,仅代表删除过程没有抛出异常

只因为delete不会遍历原型链,所以需要把代码做一下调整,才能成功删除toString方法

let obj = {
    say(){}
}
delete obj.__proto__.toString  // 直接指明删除原型上的toString方法
console.log(obj.toString)  // 输出undefined

无法删除的几种情况

除了上面提到的var let const 声明的属性无法删除外,还有以下几种情况无法删除属性

属性不可配置

const obj = {}

Object.defineProperty(obj, 'name', {
    value: 'Bruse',
    configurable: false   // 不可配置
})
console.log(delete obj.name)  // 返回false
console.log(obj.name)  // 输出Bruse

undefined

console.log(delete undefined)  // 返回false

Infinity

delete Infinity   // 返回false

NaN

delete NaN  // 返回false

window

delete window  // 返回false

document

delete document // 返回false
转载自:https://juejin.cn/post/7284221961621520439
评论
请登录