delete
var x1 = {a:1}
x1 => {a: 1}
delete x1 => false
window.x2 = {a:1}
x2 => {a: 1}
delete x2 => true
var声明的全局变量和使用let或const声明的全局变量都不能被delete删除,因为它们都是不可配置的。只有直接在全局对象上设置的属性才可以被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。
声明语句
六条声明语句
let x …
声明变量x。不可在赋值之前读。
const x …
声明常量x。不可写。
var x …
声明变量x。在赋值之前可读取到undefined值。
function x …
声明变量x。该变量指向一个函数。
class x …
声明变量x。该变量指向一个类(该类的作用域内部是处理严格模式的)。
import …
导入标识符并作为常量(可以有多种声明标识符的模式和方法)。
在ES6之后,let/const变量与var在声明标识符时没有区别,只是JavaScript拒绝访问尚未绑定值的let/const标识符。
“变量声明(varDelcs)”,而“let/const”则称为“词法声明(lexicalDecls)”。JavaScript环境在创建一个“变量名(varName in varDecls)”后,会为它初始化绑定一个undefined值,而”词法名字(lexicalNames)”在创建之后就没有这项待遇,所以它们在缺省情况下就是“还没有绑定值”的标识符。
NOTE:6种声明语句中的函数是按varDecls的规则声明的;类的内部是处于严格模式中,它的名字是按let来处理的,而import导入的名字则是按const的规则来处理的。所以,所有的声明本质上只有三种处理模式:var变量声明、let变量声明和const常量声明。
赋值操作
变量名 = 值 ❌
lRef = rValue ✅
在JavaScript中,是将右操作数(的值)赋给左操作数(的引用)。也就是说,一个赋值表达式的左边和右边其实“都是”表达式!