&& 返回参与运算的原始值而非布尔值,其短路逻辑为:左操作数falsy时直接返回该值,truthy时返回右操作数原值;用于安全访问、条件取值等场景。

JavaScript 中的 && 不是“只返回 true 或 false”的布尔运算符,它会原样返回参与运算的某个原始值——这正是理解其短路行为的关键。
短路行为的本质:一旦能确定逻辑结果,立刻停止计算
从左到右逐个求值,只要左边的操作数足以决定整个表达式的结果,右边就完全不执行:
- 如果左边是 falsy 值(false、0、""、null、undefined、NaN),整个 && 表达式直接返回这个左边的值,右边不计算
- 如果左边是 truthy 值(比如 "hello"、42、[]、{}),则继续计算右边,并返回右边的值(无论真假)
返回原始值:不是布尔转换,而是原值透传
它不把操作数强制转成布尔再返回 true/false,而是把实际参与运算的那个值原封不动地返回:
-
false && "world"→ 返回false(左边 falsy,直接返回) -
0 && 100→ 返回0(左边 falsy,原值返回) -
"ok" && null→ 返回null(左边 truthy,返回右边原值) -
[] && "done"→ 返回"done"(左边 truthy,返回右边)
常见误判点:truthy/falsy 判断发生在求值时,而非返回前
很多人以为 "0" && true 会因字符串 "0" 是真值而返回 true,其实不然——"0" 是非空字符串,在 JavaScript 中属于 truthy,所以表达式返回 true;但若写成 +"0" && true,+"0" 是数字 0(falsy),就会返回 0。关键在于:每个操作数先按 JS 规则判断真假,再决定是否短路、返回谁。
实用意义:安全访问与默认值的底层机制
这种特性让 && 成为简洁写法的基础:
- 安全取嵌套属性:
user && user.profile && user.profile.name——中间任一环节 falsy 就终止,不会报错 - 提供默认值(配合 || 更常见,但 && 也可用于“仅当条件成立才取值”):
enabled && config.timeout表示“启用时才用 timeout,否则返回 enabled(即 false/0/'' 等)” - 条件执行副作用(谨慎使用):
isLoggedIn && api.fetchData()——登录成功才调用接口

















