关于delete 语法的本质浅谈

 

本文主要为大家介绍了delete 语法的本质深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助

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: falseTypeError
  • 典型的 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 语法的本质深入解析的详细内容,希望可以帮到你。

转自:微点阅读   https://www.weidianyuedu.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值