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。
删除原则
- 删除值时,直接返回 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')
null在全局上却查询不到描述信息:
Object.getOwnPropertyDescriptor(global, 'null')
delete 不存在的变量
delete xcaskjksjakjdkasjdkasjk
// true
xcaskjksjakjdkasjdkasjk的确会得到一个引用,称为(UnresolvableReference)。
ECMAScript里面写的是if IsUnresolvableReference, then return true。也就是说,ECMAScript约定对于这种情况就是这么返回的,这属于规范约定(并且如果在这时发现是严格模式,就抛异常了)。 tc39.es/ecma262/#se…
严格模式,抛出异常:
"use strict"
delete xcaskjksjakjdkasjdkasjk
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')
可以描述信息的区别: test1 是 可配置的, test2 是 不可配置的。
引用
01 | delete 0:JavaScript中到底有什么是可以销毁的 perfectionkills.com/understandi…