所有对象转布尔值一律为true,包括空数组和空对象;唯一例外是document.all(非规范行为);判断内容是否为空需手动检查length、size或keys等属性。

因为 JavaScript 规范明确要求:所有对象(包括数组、空对象、正则、日期、Map、Set 等)在转布尔值时,一律返回 true,不看内容、不调方法、不例外。
这是规范定死的规则,不是逻辑推导
ECMAScript 的 ToBoolean 抽象操作中,对非原始值(即对象)的处理只有一条:只要类型是 Object,就直接返回 true。它不会:
- 尝试调用
toString()或valueOf() - 检查
length、size、keys()或是否为空 - 区分
[]和[1,2],也不区分{}和{a:1}
空数组和空对象也是对象
[] 和 {} 看起来“空”,但它们的 typeof 都是 "object"(数组其实是 Object 的子类),所以天然落入“对象 → true”这条路径:
-
Boolean([])→true -
Boolean({})→true -
if ([]) { ... }里的代码块一定会执行
唯一已知的例外:document.all
严格来说,存在一个特例——document.all。它是一个历史遗留的 DOM 对象,为兼容老代码,现代浏览器中它的布尔转换结果是 false,且 typeof document.all === "undefined"。但它不是规范行为,而是浏览器厂商协商出的特殊处理,不能当作通用规律。
想判断“有没有内容”,得手动检查
既然布尔转换不管内容,那真要区分“空数组”和“有元素的数组”,就得自己动手:
- 数组:用
arr.length === 0 - 普通对象:用
Object.keys(obj).length === 0 - Map/Set:用
map.size === 0或set.size === 0 - 字符串虽不是对象,但也常被误判:用
str.trim() === ""判断是否“空内容”
不复杂但容易忽略:布尔转换只认类型,不认语义。


















