双叹号(!!)是两次逻辑非运算,用于将任意值强制转换为布尔值:!0→true,!!0→false;!!"hello"→true;!!null→false;falsy值仅6个(false、0、""、null、undefined、nan),其余均为true。

双叹号(!!)是 JavaScript 中一种简洁的“强制转布尔”写法,它本身不是独立运算符,而是两次取反(!)的组合:先用 ! 转为布尔并取反,再用第二个 ! 取反回来,最终得到原值对应的布尔值。
双叹号的本质:两次逻辑非
JavaScript 会先对操作数执行一次 !,这一步会把值转为布尔并取反;第二次 ! 再取反,抵消逻辑反转,只保留类型转换效果。
-
!0→true(因为 0 是 falsy),再!!0→false -
!"hello"→false(非空字符串是 truthy),再!!"hello"→true -
!!null→false,!!undefined→false,!![]→true,!!{}→true
哪些值转成 false(falsy 值)
只有以下 6 个值用 !! 会得到 false,其余一切值(包括 new Boolean(false)、new String("")、Number(0) 等包装对象)都是 true:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
false-
0(包括-0和0n) -
""(空字符串) nullundefinedNaN
和 Boolean() 构造函数的区别
!!x 和 Boolean(x) 在结果上完全等价,但风格和用途略有不同:
-
!!x更轻量、更常见于条件判断或状态归一化(比如配置项默认值处理) -
Boolean(x)语义更清晰,适合教学或强调类型意图的场景 - 二者都不会抛错,即使
x是undefined或null也能安全使用
实用小技巧与注意事项
常用于快速校验变量是否“存在且有效”,但要注意别误判“有意义的 falsy 值”:
- ✅ 适合判断“有没有传参”:
if (!!callback) callback() - ⚠️ 不适合判断“数字是否为 0”:
!!0是false,但 0 可能是合法输入(如分页第 0 页) - ⚠️ 对象属性存在性不能只靠
!!obj.prop,因为prop可能是0、""或false,需结合in或hasOwnProperty - ? 可配合空值合并操作符:
const enabled = !!(config.enabled ?? true)
不复杂但容易忽略细节。掌握 falsy 值列表,就能准确预判 !! 的行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










