JavaScript中双叹号(!!)将非布尔值转为布尔值,本质是两次取反;undefined、null、0(含-0、0n)、NaN、空字符串''、false共6个falsy值转为false,其余值均转为true,行为与Boolean()完全一致。

JavaScript 中用双叹号(!!)将非布尔值转为布尔值,本质是两次取反:先用 ! 转成布尔值并取反,再用第二个 ! 把结果反转回来,最终得到原值对应的布尔等价形式。
哪些值会变成 false
以下 6 个“falsy 值”经 !! 后结果为 false:
undefinednull-
0(包括-0和0n) NaN- 空字符串
''(注意:' '、'0'、'false'都是true) -
false(本身已是布尔值,!!false === false)
其他值一律变成 true
只要不是上面 6 种,!! 都返回 true,包括:
- 非空字符串:
!!'hello'→true - 非零数字:
!!42、!!-1、!!3.14→true - 对象(含数组、函数、正则、日期等):
!!{}、!![]、!!function(){}→true - Symbol 和 BigInt(非零):
!!Symbol('a')、!!1n→true
和 Boolean() 的区别
!!x 和 Boolean(x) 行为完全一致,都是显式类型转换。区别在于写法和语境:
立即学习“Java免费学习笔记(深入)”;
-
!!更简短,常见于条件判断缩写(如if (!!value) { ... }) -
Boolean()语义更清晰,适合需要强调类型转换意图的场景(如文档、教学或复杂逻辑中) - 二者都没有副作用,不改变原值,也不抛错(哪怕
x是未声明变量,但此时会报ReferenceError,和!!无关)
实际使用小提醒
多数时候你不需要显式转布尔值——JavaScript 在 if、&&、||、三元运算符等地方会自动进行 ToBoolean 转换。只有当你明确需要一个布尔类型的值(比如存入状态、返回 API 响应字段、做严格相等比较)时,才用 !! 或 Boolean()。
例如:避免 const isValid = !!user && !!user.name;,而应直接 if (user && user.name) { ... };但若需构造纯布尔对象字段:{ hasName: !!user?.name } 就很合理。


















