三元运算符(? :)是用于根据条件选择值的表达式,由条件、真值、假值三部分组成;适用于赋值、返回值等需返回结果的场景,不可替代含副作用的语句,嵌套宜谨慎,具备短路特性。

三元运算符(? :)是简化单行 if-else 分支的常用语法,适用于“根据条件选择一个值”的场景。它不是万能替代,但当逻辑清晰、表达式简洁时,能让代码更紧凑易读。
基本写法:条件 ? 真值 : 假值
三元运算符由三部分组成,用问号和冒号分隔:
-
条件:一个布尔表达式,结果为
true或false - 真值:条件为真时返回的表达式(可为变量、字面量、函数调用等)
- 假值:条件为假时返回的表达式
例如,判断年龄是否成年并赋值:
JavaScriptconst status = age >= 18 ? 'adult' : 'minor';
适用场景:只返回值,不执行语句
三元运算符本质是**表达式**,必须有返回值;不能直接替换含副作用的 if-else 语句,比如:
- ✅ 合适:赋值、返回值、模板插值、函数参数传入
- ❌ 不合适:调用多个函数、修改状态、含
console.log或throw等语句操作
错误示例(语法报错或逻辑混乱):
JavaScriptage >= 18 ? console.log('Welcome') : alert('Access denied'); // ❌ 不推荐——这不是取值,是执行动作
应改用普通 if-else:
if (age >= 18) console.log('Welcome'); else alert('Access denied');
嵌套要谨慎,优先考虑可读性
可以嵌套使用,但超过一层就容易难懂:
JavaScriptconst grade = score >= 90 ? 'A' : score >= 80 ? 'B' : score >= 70 ? 'C' : 'F';
这种写法虽短,但维护成本高。更清晰的方式是:
- 用
if-else if-else分段判断 - 或封装为函数(如
getGrade(score)) - 在支持的环境里,用
switch或查找表(如对象映射)
注意类型一致性与短路行为
真值和假值的类型不必完全相同,但应确保接收方能合理处理(比如都为字符串、都可转为数字);另外,三元运算符具有短路特性——只计算被选中的分支:
JavaScriptconst result = flag ? expensiveCalc() : defaultValue;
若 flag 为 false,expensiveCalc() 不会执行。

















