alert(1 && null && 2) 弹出 null,因为 && 从左到右求值,遇到第一个 falsy 值 null 即停止并返回其原始值。

JavaScript 中的逻辑与运算符(&&)并不强制返回布尔值,而是返回**最后一个被求值的操作数**。它会从左到右依次计算操作数,遇到第一个“假值”(falsy)就立即返回该值,不再继续;如果所有操作数都是“真值”(truthy),则返回最右边的操作数。
什么是假值(falsy)?
JavaScript 有且仅有以下六个假值:false、0、-0、0n(BigInt 零)、""(空字符串)、null、undefined、NaN。其余所有值(包括 {}、[]、new Date()、function(){}、甚至字符串 "false" 或 "0")都属于真值(truthy)。
&& 的实际求值过程
它不是“转成布尔再算”,而是直接按操作数原始值短路判断:
-
1 && "hello"→ 返回"hello"(左边是 truthy,继续,右边是 truthy,返回右边) -
0 && "hello"→ 返回0(左边是 falsy,立即返回,不计算右边) -
"a" && [] && {x: 1}→ 返回{x: 1}(全部 truthy,返回最后一个) -
"a" && null && 42→ 返回null(null是 falsy,前面为 truthy,所以停在这儿并返回null)
常见误用与安全写法
很多人误以为 a && b 等价于 Boolean(a) && Boolean(b),但其实前者返回原始值,后者才返回布尔结果:
- 想取默认值:用
value && value没意义,应改用value ?? defaultValue(空值合并)或value || defaultValue(注意0、""也会触发默认) - 想做条件执行但不关心返回值:可以保留
&&,比如user && user.name && console.log(user.name) - 想明确得到布尔结果:显式转换,如
!!(a && b)或Boolean(a && b)
和 || 的对比记忆技巧
&& 找“第一个假值”,没找到就返回最后一个;|| 找“第一个真值”,没找到就返回最后一个。两者都短路、都返回原值、都不转布尔。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











