表达式
表达式是一个可以被求值的短语。
主表达式
主表达式即独立存在、不再包含更简单表达式的表达式。
主表达式包含各类字面量值、常量、变量引用、代表值的关键字等:
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 // 如果没有参数,可以省略圆括号