标准答案:第一个和第三个alert会执行。-1||0返回-1(truthy),-1&&0返回0(falsy),null||-1&&1因&&优先级高先算得1(truthy),故first和third弹出。

JavaScript 中 if 语句本身不直接“处理”短路逻辑,而是依靠 &&(逻辑与)和 ||(逻辑或)运算符的短路特性来组合多个布尔条件。关键在于理解这些运算符如何逐个求值、何时停止,并据此写出安全、可读、高效的判断逻辑。
短路机制是怎么工作的
&& 遇到第一个“假值”(falsy)就停止,返回该值;|| 遇到第一个“真值”(truthy)就停止,返回该值。所谓“假值”包括 false、0、""、null、undefined、NaN;其余为真值。
-
if (a && b && c):只有a为真,才计算b;b也为真,才计算c;任一为假,整个表达式为假,且不执行后续判断 -
if (a || b || c):只要a为真,就不看b和c;仅当a假时才检查b,依此类推
用短路避免运行时错误
最常见用途是防止访问 null 或 undefined 的属性:
-
if (user && user.profile && user.profile.name)—— 安全检查嵌套属性,不会报Cannot read property 'profile' of undefined -
if (arr && arr.length > 0)—— 先确认arr存在,再访问length - 反例:
if (user.profile.name)在user为undefined时直接报错
混合使用 && 和 || 要注意优先级
&& 优先级高于 ||,所以 a || b && c 等价于 a || (b && c),不是 (a || b) && c。有歧义时务必加括号:
立即学习“Java免费学习笔记(深入)”;
- 想表达“登录了,或者有访客权限且在白名单” →
if (isLoggedIn || (isGuest && inWhitelist)) - 不加括号写成
if (isLoggedIn || isGuest && inWhitelist)逻辑不变,但可读性差,易出错 - 需要“(登录或访客)且在白名单” → 必须写
if ((isLoggedIn || isGuest) && inWhitelist)
短路不等于条件分支,别误用赋值或副作用
短路表达式常被用于简洁赋值(如 const name = user && user.name || "Anonymous"),但在 if 中应聚焦逻辑判断本身:
- 避免在条件中调用有副作用的函数,例如
if (isValid() && saveToDB())—— 若isValid()为假,saveToDB()不执行,这看似省事,但会让业务逻辑隐晦难维护 - 更清晰的做法是分步写:
if (isValid()) { saveToDB(); } - 短路适合做“守卫”(guarding),不适合承载核心业务流程


















