JavaScript 你所不知道的delete
前言
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声明的属性,不能从全局作用域或者函数的作用域删除
用let或const声明的属性,不能从它声明的作用域删除
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
非严格模式,删除一个未声明的变量b,delete会返回true,仅表示删除变量b这个过程没有发生异常
let obj = {
say(){}
}
delete obj.say // 删除方法,返回true
console.log(obj.say) // 输出undefined
当删除obj的say方法时,返回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