1、delete 运算符运行原理

  • delete 运算符尝试删除值数据时,会返回 true,用于表示没有错误(Error)。
  • delete 0 的本质是删除一个表达式的值(Result)。
  • delete x 与上述的区别只在于 Result 是一个引用(Reference)。
  • delete 其实只能删除一种引用,即对象的成员(Property)。

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

疑问点:
delete null 返回true,delete undefined 返回false 为啥啊?不都是值吗?

undefined是一个全局属性,而null是一个关键字。
由于undefined是全局属性,所以delete undefined其实就是 delete global.undefined,是删除引用,而不是删除值。而这个属性是只读的,所以就返回false了。

  1. > Object.getOwnPropertyDescriptor(global, 'undefined')
  2. { value: undefined,
  3. writable: false,
  4. enumerable: false,
  5. configurable: false
  6. }

2、声明和语句的区别

声明和语句的区别在于发生的时间点不同,声明发生在编译期,语句发生在运行期。
声明发生在编译期,由编译器为所声明的变量在相应的变量表,增加一个名字。
语句是要在运行时执行的程序代码。因此,如果声明不带初始化,那么可以完全由编译器完成,不会产生运行时执行的代码。