跳到主要内容

表达式

表达式是一个可以被求值的短语。

主表达式

主表达式即独立存在、不再包含更简单表达式的表达式。

主表达式包含各类字面量值、常量、变量引用、代表值的关键字等:

Math.PI     // 常量
i // 变量
"hello" // 字符串字面量
/pattern/ // 正则字面量
false // 布尔值关键字
null // null 值关键字

给定不存在的变量会导致抛出 ReferenceError 。

数组 & 对象初始化

这类表达式也可以称为数组、对象字面量:

[];             // 空数组
[1, 2 + 3]; // => [1, 5]
[1,,,4]; // => [1, 空×2, 4],访问空元素会返回 undefined

{}; // 空对象
{ x: 0, y: 0 };

[{ x: 0, y: 0 }, { x: 5, y: 5 }]; // 数组、对象可以相互嵌套

函数表达式

用 function 关键字来定义函数。也可以叫函数字面量:

let square = function(x) { return x * x }

ES6 中支持箭头函数:

let multiply = (a, b) => a * b

属性访问

属性访问包括访问数组元素及对象属性:

let arr = [10, 5, 25, 70]
arr[2] // => 25

let obj = { x: 1, y: 2 }
obj.x // => 1
obj["y"] // => 2

函数或方法调用

函数调用 :

function double(x) { return x * 2 }
double(3) // => 6

如果调用前为属性访问,则被称为 方法 调用。方法调用中,属性访问对象在函数体执行时称为 this 关键字的值,通过 this 可以对所属对象进行操作:

let obj = {
value: 1,
double: function() { this.value *= 2 }
}

obj.double()
obj.value // => 2

可选链

ES2020 中,可以通过 ?. 语法使用可选链,来安全地访问可能为空值的属性:

let obj = { x: 0, y: { a: 0 } }

obj.y.z // => undefined
obj.y.z.k // ! TypeError
obj.y?.z.k // => undefined
obj.y?.["z"].k // => undefined

可选链会检查 ?. 的左侧变量是否有右侧指定属性,若无则终止后续的属性访问,返回 undefined

可选链也可以用在方法调用上,但是只会检查 ?. 的左侧是否为空,不会检查是否为函数,如果不是函数仍会报错。比如,对于 obj.m?.() 来说,除了 ojb 必须有 m 属性外,m 值只有为函数时才不会抛出错误。

对象构建

使用 new 关键字外跟上一个(构造)函数来创建一个对象:

new Object()
new Date // 如果没有参数,可以省略圆括号

参考

表达式和运算符 - MDN