在JavaScript中,表达式(Expression) 和语句(Statement) 是两个核心概念,它们的主要区别在于是否有返回值。
1. 表达式(Expression)
表达式是会产生一个值的代码片段。表达式可以出现在任何需要值的地方。
特点:
- 总是会返回一个值
- 可以作为其他表达式的一部分
常见表达式类型:
// 1. 字面量表达式
5 // 数字字面量
'hello' // 字符串字面量
true // 布尔字面量
{ name: 'John' } // 对象字面量
[1, 2, 3] // 数组字面量
// 2. 变量引用表达式
x
myVariable
// 3. 算术表达式
10 + 5 // 返回 15
x * y
// 4. 赋值表达式
x = 10 // 返回 10
y = x + 5 // 返回 15
// 5. 函数调用表达式
Math.max(1, 2, 3) // 返回 3
console.log('hi') // 返回 undefined
// 6. 比较表达式
x > 5 // 返回 true 或 false
a === b
// 7. 逻辑表达式
x && y
a || b
// 8. 三元条件表达式
age >= 18 ? 'adult' : 'minor'
2. 语句(Statement)
语句是执行一个操作的代码片段,通常不返回值(除了表达式语句)。
特点:
- 执行操作但不一定有返回值
- 构成程序的基本结构单元
常见语句类型:
// 1. 声明语句
let x; // 变量声明
const y = 10;
function foo() {} // 函数声明
// 2. 条件语句
if (x > 10) {
console.log('big');
} else {
console.log('small');
}
// 3. 循环语句
for (let i = 0; i < 5; i++) {
console.log(i);
}
while (x < 10) {
x++;
}
// 4. 控制流语句
break;
continue;
return x + y;
throw new Error('Oops!');
// 5. 表达式语句(特殊的语句)
x = 10; // 赋值表达式作为语句
foo(); // 函数调用表达式作为语句
3. 关键区别
| 特性 | 表达式 | 语句 |
|---|---|---|
| 是否有返回值 | 总是有 | 通常没有(表达式语句除外) |
| 能否独立存在 | 不能,需要被使用 | 可以独立成为一行代码 |
| 能否嵌套 | 可以嵌套在其他表达式中 | 不能嵌套(某些语句包含表达式) |
| 主要目的 | 产生一个值 | 执行一个操作 |
4. 表达式语句
有些表达式可以单独作为语句使用,这叫做表达式语句:
// 这些都是表达式,但作为语句使用
x++; // 自增表达式语句
x = 10; // 赋值表达式语句
foo(); // 函数调用表达式语句
5. 需要注意的情况
立即执行函数表达式(IIFE)
// 函数表达式可以作为语句的一部分
(function() {
console.log('IIFE');
})();
// 或者用括号包裹
(() => {
console.log('Arrow IIFE');
})();
对象字面量作为语句
// 这会被解释为代码块,而不是对象
{ name: 'John' } // 语法错误或代码块
// 需要加括号使其成为表达式
({ name: 'John' }) // 对象表达式
函数声明 vs 函数表达式
// 函数声明(语句)
function foo() {
return 'foo';
}
// 函数表达式(表达式)
const bar = function() {
return 'bar';
};
// 箭头函数表达式
const baz = () => 'baz';
6. 实际应用示例
// 表达式在语句中
if (x > 5) { // x > 5 是表达式,if 是语句
console.log('大于5');
}
// 表达式作为函数参数
console.log(x + y); // x + y 是表达式
// 语句不能放在需要表达式的地方
const result = if (x > 5) { return 'yes' } else { return 'no' }; // 错误!
const result = x > 5 ? 'yes' : 'no'; // 正确,使用三元表达式
// 在模板字符串中只能使用表达式
const message = `结果是:${x > 5 ? '通过' : '失败'}`;
理解表达式和语句的区别对于编写正确、高效的JavaScript代码非常重要,特别是在使用箭头函数、条件运算符和对象解构等现代JavaScript特性时。