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