今天小编给大家分享一下delete语法的本质是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
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); // falseconsole.log(obj); // { b: 2 }
delete 不能删除哪些属性
任何用
var
声明的属性,不能从全局或函数作用域删除任何用
let
或者const
声明的属性 ,不能从它声明的作用域删除不可配置(
configurable: false
)的属性不能删除
// varfunction testVar() { var a = 1; console.log(delete a); // false console.log(a); // 1}testVar();// let constfunction testLet() { let a = 2; console.log(delete a); // false console.log(a); // 2}testLet();// configurableconst obj = {};Object.defineProperty(obj, "name", { configurable: false });console.log(delete obj.name); // falseconsole.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 依然可用,因为原型链可以查找到 nameconsole.log(p.name); // 黛玉// 删除原型上的属性console.log(delete User.prototype.name); // true// 实例和原型上都没有 nameconsole.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();// configurableTypeErrorconst person = { name: "帅哥"};Object.defineProperty(person, "name", { configurable: false});delete person.name;// 严格 referclass 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语法的本质是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。