表达式语句
表达式语句是指在需要语句的地方使用的表达式。该表达式被执行后,它的结果将被丢弃——因此,它仅对有着副作用的表达式有意义,例如执行函数或者更新变量。
语法
js
expression;
描述
被禁用的表达式
为了将表达式用作语句,它禁止与其他的语句语法有歧义。因此,表达式禁止以以下任何标记开头:
function
:这将是function
声明或者function*
声明,而不是function
表达式或者function*
表达式async function
:这将是async function
声明或者async function*
声明,而不是async function
表达式或者async function*
表达式class
:这将是class
声明,而不是class
表达式let[
:这将是带有数组解构的let
声明,而不是称为let
变量的属性访问器(let
仅可以是在非严格模式下的标识符){
:这将是一个块语句,而不是对象字面量
因此,以下所有内容均无效:
js
function foo() {
console.log("foo");
}(); // SyntaxError: Unexpected token '('
// 出于某种原因,你有一个叫做 `let` 的变量
var let = [1, 2, 3];
let[0] = 4; // SyntaxError: Invalid destructuring assignment target
{
foo: 1,
bar: 2, // SyntaxError: Unexpected token ':'
};
更危险的是,有时候代码碰巧是有效的语法,但是这并不是你想要的。
js
// 出于某种原因,你有一个叫做 `let` 的变量
var let = [1, 2, 3];
function setIndex(index, value) {
if (index >= 0) {
// 打算分配给数组 `let`,但是却创建一个额外的变量!
let[index] = value;
}
}
setIndex(0, [1, 2]);
console.log(let); // [1, 2, 3]
// 这并不是一个对象字面量,而是一个块语句。
// 其中 `foo` 是标签,`1` 是表达式语句。
// 这通常在控制台中发生
{ foo: 1 };
为了避免这些问题,你可以使用圆括号,使语句明确地作为一个表达式。
js
(function foo() {
console.log("foo");
})();
示例
避免控制流语句
你可以使用表达式语句来避免几乎所有控制流语句的使用。例如,可以使用三元运算符和逻辑运算符替换 if...else
。像 for
或者 for...of
可以使用数组方法来替换。
js
// 使用控制流语句
function range(start, end) {
if (start > end) {
[start, end] = [end, start];
}
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
}
// 使用表达式语句
function range2(start, end) {
start > end && ([start, end] = [end, start]);
return Array.from({ length: end - start }, (_, i) => start + i);
}
警告: 这仅演示了该语言的功能。过度的使用表达式语句来替代控制流语句会大大降低代码的可读性。
规范
Specification |
---|
ECMAScript Language Specification # sec-expression-statement |