delete 的返回值
delete 语法是用于 JS 删除对象属性和数组元素
返回 boolean
类型
true 代表删除没有发生异常,但不一定是删除成功
false 一定是删除失败
1
2
3
4
5
6
7
8
9
10
11
|
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
)的属性不能删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// 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 删除原型上的属性
- 不会遍历原型链删除
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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
- 引用类型,删除引用
1
2
3
4
5
6
|
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
下面是错误的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
"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 语法解析的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/7205546336082362428