优先用 if 处理明确分支逻辑,用 switch 处理多个离散值匹配;避免嵌套过深、条件塞入赋值语句;布尔/范围/组合条件用 if,离散值匹配用 switch;字符串判空应写 if (str?.trim()) 而非 if (str)。
JavaScript 中的条件语句不是“怎么写对”,而是“怎么写得不容易出错、好维护、能被别人一眼看懂”。直接上结论:优先用 if 处理明

switch 处理多个离散值匹配,避免嵌套过深,别把条件判断塞进赋值语句里。
if 适合做布尔判断、范围判断、组合条件(比如 a > 0 && b );switch 只适合严格相等(===)的单值匹配,比如状态码、枚举字段、固定字符串。
switch 时,每个 case 后必须显式写 break,漏掉就会“穿透”到下一个分支 —— 这是线上 bug 的高频来源null 或 undefined,否则 switch 会走到 default 或直接报错if 嵌套超过三层就该考虑拆成函数,比如把权限校验逻辑抽成 canAccess(resource)
? : 到底能不能用?能用,但只限于简单取值场景,比如给变量设默认值、控制 JSX 中的 class 名。它不是 if 的缩写替代品。
user.role === 'admin' ? (user.status === 'active' ? 'granted' : 'pending') : 'denied' —— 可读性归零const className = isActive ? 'btn--active' : 'btn--default'
??,比如 config.timeout ?? 5000,比 config.timeout || 5000 不会误吞 0 或 false
JavaScript 在 if 判断中会自动调用 ToBoolean,导致 0、''、null、undefined、NaN 都为 false。这不是 bug,但常被误用。
if (obj),而要写 if (obj != null) 或 if (obj !== undefined && obj !== null),防止 obj 是 0 或 false 时逻辑跳过if (arr),要用 if (Array.isArray(arr) && arr.length > 0)
if (str),因为 ' '(空格)会被转成 true,应写 if (str?.trim())
最麻烦的不是语法不会写,而是团队里有人把条件逻辑藏在 getter 里、有人用 !! 强转、还有人把整个 if 块包进立即执行函数 —— 这些都会让后续排查变得困难。保持条件表达式直白,比追求“一行写完”重要得多。