delete 的返回值
delete 语法是用于 JS 删除对象属性和数组元素
返回 boolean
类型
true 代表删除没有发生异常,但不一定是删除成功
false 一定是删除失败
var obj = {
a: 1,
b: 2
};
// 删除对象属性
console.log(delete obj.a); // true
// 删除对象不存在的属性
console.log(delete obj.name); // true
// 删除全局对象 obj ,因为 var 声明默认会挂载到全局 window 对象上
console.log(delete obj); // false
console.log(obj); // { b: 2 }
delete 不能删除哪些属性
- 任何用
var
声明的属性,不能从全局或函数作用域删除 - 任何用
let
或者const
声明的属性 ,不能从它声明的作用域删除 - 不可配置(
configurable: false
)的属性不能删除
// var
function testVar() {
var a = 1;
console.log(delete a); // false
console.log(a); // 1
}
testVar();
// let const
function testLet() {
let a = 2;
console.log(delete a); // false
console.log(a); // 2
}
testLet();
// configurable
const obj = {};
Object.defineProperty(obj, "name", { configurable: false });
console.log(delete obj.name); // false
console.log("delete undefined", delete undefined);
console.log(Object.getOwnPropertyDescriptor(global, "undefined"));
console.log("delete Infinity", delete Infinity);
console.log("delete NaN", delete NaN);
delete 删除原型上的属性
- 不会遍历原型链删除
function User() {
this.name = "云牧";
}
User.prototype.name = "黛玉";
const p = new User();
// 删除的是 p 对象的自身属性
console.log(delete p.name); // true
// p.name 依然可用,因为原型链可以查找到 name
console.log(p.name); // 黛玉
// 删除原型上的属性
console.log(delete User.prototype.name); // true
// 实例和原型上都没有 name
console.log(p.name); // undefined
delete 删除的到底是什么
- 删除的是操作表达式结果
- 对于值,字面量或不可达的引用,不操作,直接返回 true
- 引用类型,删除引用
var nameVar = "nameVar";
nameNotVar = "nameNotVar";
// var 声明的不可以删除
console.log(Object.getOwnPropertyDescriptor(window, "nameVar")); // configurable: false
// 非 var 声明的可以删除
console.log(Object.getOwnPropertyDescriptor(window, "nameNotVar")); // configurable: true
严格模式删除报错
- 对于 变量,函数名,函数参数:
SyntaxError
- 对于
configurable: false
:TypeError
- 典型的
delete super.property
:ReferenceError
下面是错误的例子:
"use strict";
// 变量
var name = "name";
delete name;
// 函数和函数参数
function fn() {}
delete fn;
function fn(name) {
delete name;
}
fm();
// configurableTypeError
const person = {
name: "帅哥"
};
Object.defineProperty(person, "name", {
configurable: false
});
delete person.name;
// 严格 refer
class Parent {
constructor(name) {
this.name = name;
}
getName() {}
}
class Child extends Parent {
constructor(name, age) {
super(name);
this.age = age;
}
deleteAny() {
delete super.getName;
}
}
var child = new Child("child", 18);
child.deleteAny();
以上就是delete 语法的本质深入解析的详细内容,更多关于delete 语法解析的资料请关注编程网其它相关文章!