delelet 操作
- delete从不删除值。delete只能删除引用
- 这个操作的正式语法设计并不是“删除某个东西”,而是“删除一个表达式 的结果”:
delete UnaryExpression
表达式的值
在 ECMAScript 的规范中,称为“引用”。 这是一种称为“规范类型”的东西。
如何理解 delete 0
delete 0
- JavaScript 将 0 视为一个表达式,并尝试删除它的求值结果 这个0是一个表达式求值;
- 现在这里的 0,其实不是值(Value)类型的数据,而是一个表达式运算的结果值 (Result)。而在进一步的删除操作之前,JavaScript 需要检测这个 Result 的类型
- 如果它是值,则按照传统的 JavaScript 的约定返回 true;
- 如果它是一个引用,那么对该引用进行分析,以决定如何操作。
- delete 0 这种行为并不真的能够发生,它什么也没做,只是返回了true而已。
ECMAScript 约定:任何表达式计算的结果(Result)要么是一个值, 要么是一个引用。
如何理解 delete x
delete x
- 出于 JavaScript 是动态语言这项特性,所以从根本上来 说,我们是没有办法在语法分析期来判断x的性质的。所以现在,需要有一种方法在运行期
来标识x的性质,以便进一步地处理它。 - delete x中的x是一个引用;
- “delete x”归根到底,是在删除一个表达式的、引用类型的结果(Result),而不 是在删除 x 表达式和这个删除表达式的值(Value)。
delete 正常语法
delete 不仅仅是要操作 0 或 x 这样的单个记号或标识符(例如变量)。因为这个语法实际 起作用的是一个对象的属性,也就是“删除对象的成员”。那么它真正需要的语法其实是:
delete obj.x
如何理解 x=x
x=x
所有赋值操作的含义,是将右边的“值”,赋给左边用于包含该值的“引用”。
x=x 会被翻译成:
x = GetValue(x)
x=x的语义并不是“x 赋给 x”,而是“把值 x 赋给引用 x”。
如何理解 delete obj.x
delete obj.x
delete obj.x 中 obj.x 是一组表达式连续运算的结果(Result/ 引用);
总结:
- “引用”是在 ECMAScript 规范层面的概念,因此在 JavaScript 语言中能操作它的
语法元素其实非常非常少, delete 就是其中之一 - delete 运算符尝试删除值数据时,会返回 true,用于表示没有错误。 delete 0 的本质是删除一个表达式的结果
- delete x 与上述的区别只在于 Result 是一个引用
- delete 其实只能删除一种引用,即对象的成员
网友评论