delete

1,318 阅读2分钟

delete在删除什么

delete 并不是 删除某个东西,而是 删除一个表达式的结果

delete x

delete x归根到底,是在删除一个表达式的、引用类型的结果(Result),而不是在删除 x 表达式,或者这个删除表达式的值(Value)

  • delete 0中的这个0是一个表达式求值;
  • delete x中的x是一个引用;
  • delete obj.x中obj.x是一组表达式连续运算的结果(Result/ 引用);

所以,只有在delete x等值于delete obj.x时 delete 才会有执行意义。例如with (obj) ...语句中的 delete x,以及全局属性 global.x。

删除原则

  1. 删除值时,直接返回 true,表明该行为过程中没有异常
delete 0
delete "123"

JavaScript 1.2 的时代并没有结构化异常处理(即 try…catch 语句)。 所以,通过函数调用中返回 true 来表明没有异常,其实是很常规的做法。

delete null 和 delete undefined

undefined是一个全局属性,而null是一个关键字。

delete null // true ,删除没有异常
delete undefined // false, 不能被删除

undefined是一个全局的值

Object.getOwnPropertyDescriptor(global, 'undefined')

截图_20212014102047.png

null在全局上却查询不到描述信息:

Object.getOwnPropertyDescriptor(global, 'null')

截图_20212114102114.png

delete 不存在的变量

delete xcaskjksjakjdkasjdkasjk
// true

xcaskjksjakjdkasjdkasjk的确会得到一个引用,称为(UnresolvableReference)。

ECMAScript里面写的是if IsUnresolvableReference, then return true。也就是说,ECMAScript约定对于这种情况就是这么返回的,这属于规范约定(并且如果在这时发现是严格模式,就抛异常了)。 tc39.es/ecma262/#se…

严格模式,抛出异常:

"use strict"
delete xcaskjksjakjdkasjdkasjk

截图_20212514102514.png

delete {}

delete {}

delete {}中的对象字面量其实是

里要删除的是一个对象字面量,当它被作为表达式执行的时候,结果也是一个值。

这类表达式称为单值表达式,这里并没有所谓的引用

delete 不存在的变量赋值

非严格模式下,向不存在的变量赋值,会自动全局创建变量:


function log(msg){
    test1 = 10;
    console.log("log:", msg)
}

log("test1");
test1 // 10

同理,我们试试删除这类变量

test1 = 10;
var test2 = 10

delete test1 // true
delete test2 // false

根本原因呢?

test1 = 10;
var test2 = 10
Object.getOwnPropertyDescriptor(global, 'test1')
Object.getOwnPropertyDescriptor(global, 'test2')

截图_20211014111007.png

截图_20211014111023.png

可以描述信息的区别: test1 是 可配置的, test2 是 不可配置的。

引用

01 | delete 0:JavaScript中到底有什么是可以销毁的 perfectionkills.com/understandi…