表达式语句
**表达式语句**是在需要语句的地方使用的表达式。表达式将被评估,其结果将被丢弃 - 因此,它只对具有副作用的表达式有意义,例如执行函数或更新变量。
语法
描述
禁止的表达式
为了使表达式用作语句,它不能与其他语句语法混淆。因此,表达式不能以以下任何标记开头
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 '('
// For some reason, you have a variable called `let`
var let = [1, 2, 3];
let[0] = 4; // SyntaxError: Invalid destructuring assignment target
{
foo: 1,
bar: 2, // SyntaxError: Unexpected token ':'
};
更危险的是,有时代码恰好是有效的语法,但这不是您的本意。
js
// For some reason, you have a variable called `let`
var let = [1, 2, 3];
function setIndex(index, value) {
if (index >= 0) {
// Intend to assign to the array `let`, but instead creates an extra variable!
let[index] = value;
}
}
setIndex(0, [1, 2]);
console.log(let); // [1, 2, 3]
// This is not an object literal, but a block statement,
// where `foo` is a label and `1` is an expression statement.
// This often happens in the console
{ foo: 1 };
为了避免这些问题,您可以使用括号,这样语句就明确地是表达式语句。
js
(function foo() {
console.log("foo");
})();
示例
避免控制流语句
您可以使用表达式语句来避免几乎所有控制流语句的使用。例如,if...else
可以用三元运算符 和 逻辑运算符 替换。像 for
或 for...of
这样的迭代语句可以用数组方法 替换。
js
// Using control flow statements
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;
}
// Using expression statements
function range2(start, end) {
start > end && ([start, end] = [end, start]);
return Array.from({ length: end - start }, (_, i) => start + i);
}
**警告:** 这只演示了语言的功能。过度使用表达式语句来替代控制流语句会使代码的可读性降低很多。
规范
规范 |
---|
ECMAScript 语言规范 # sec-expression-statement |