!!操作符通过两次逻辑非运算将任意值转为布尔值:第一次!按ToBoolean规则转布尔并取反,第二次!再取反还原,结果等价于Boolean()但更简洁;falsy值仅限false、0、-0、0n、""、null、undefined、NaN共8个,对象(含{}、[]等)恒为truthy。

逻辑非运算符 ! 在 JavaScript 中处理对象值时,会先将对象隐式转换为布尔值,再取反。这个过程不依赖对象具体内容,只取决于它是否为“真值”(truthy)或“假值”(falsy)。
对象默认是真值
除少数特例外,所有对象(包括空对象 {}、空数组 []、new Date()、/regex/ 等)在布尔上下文中都视为 true。所以:
-
!{}→false(因为{}是 truthy,取反得 false) -
![]→false(同理,[]也是 truthy) -
!new Date()→false
哪些对象会被转成 false?
JavaScript 中没有对象本身是 falsy 的。所谓“假值”只有六个固定原始值:false、0、-0、0n、""(空字符串)、null、undefined、NaN。注意:对象永远不在这个列表里。
即使看起来“空”或“无效”的对象,比如:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
-
!{a: undefined}→false -
!Object.create(null)→false -
!JSON.parse('{}')→false
它们都仍是对象,因此都是 truthy,取非后为 false。
为什么不会调用 ToPrimitive 或 toString/valueOf?
因为 ! 运算符只关心布尔转换(ToBoolean),不触发字符串或数字转换流程。它直接按规则判断:对象 → true(无例外),然后取反。
也就是说,! 不会尝试调用 obj.toString() 或 obj.valueOf(),也不会走 Symbol.toPrimitive 流程 —— 那些是在 +、==、 等运算中才启用的。
常见误区澄清
-
!{}不等于!String({}):后者先转成"[object Object]"再转布尔,结果还是 true → 取反为 false,看似一样,但路径不同 -
![] == !{}→true(都是 false),但这不代表它们“相等”,只是布尔转换结果碰巧一致 - 想检测对象是否“为空”,不能靠
!obj,而要用Object.keys(obj).length === 0或JSON.stringify(obj) === "{}"等显式判断

















