前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库JavaScript 假值列表
JavaScript值与类型

JavaScript 里有哪些假值?能把完整列表背出来吗?

假值只有 8 个:false、0、-0、0n、NaN、''、null、undefined,浏览器里还有一个历史遗留的 document.all。除此之外全部是真值,包括空数组、空对象、字符串 '0' 和 'false'。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#值与类型
先看核心答案读代码示例
理解线索

条件判断背后的转换

  1. ToBooleanif、!、&&、||、三元运算都用它,查表直接给结果
  2. 原始值只有「零值」和「空值」是假:各种 0、NaN、空串、null、undefined
  3. 对象一律为真,不会调用 valueOf 或 toString

document.all 是唯一为假的对象,为了兼容老代码里 if (document.all) 这种浏览器嗅探,规范专门给它开了口子。

核心回答

先记住这个答案

在 if、while、!、&&、|| 这些需要真假的地方,JavaScript 会把值转成布尔值。会被转成 false 的只有这些:false、0、-0、0n、NaN、空字符串 ''、null、undefined,浏览器里另外还有 document.all。这份名单是固定的,不在上面的一律是真值。面试最容易被追问的是反例:[]、{}、'0'、'false'、new Boolean(false) 全都是真值。

  • 假值是固定名单,不在名单上的都是真值
  • 所有对象都是真值,空数组、空对象也不例外
  • 字符串只有空串是假值,'0' 和 ' ' 是真值
  • if (x) 与 x == false 规则不同

名单之外的全是真值

背名单不难,难的是面对具体值时别凭感觉。下面这些值看起来「空」或者「假」,实际都是真值。

验证假值名单和几个反例JavaScript
const falsy = [false, 0, -0, 0n, NaN, '', null, undefined]
console.log(falsy.every((v) => !v))

const looksFalsy = ['0', 'false', ' ', [], {}, -1, new Boolean(false)]
console.log(looksFalsy.map((v) => Boolean(v)).join(' '))

console.log(Boolean([]), [] == false) // 同一个值,两种判断结果相反
查看输出与解释
true
true true true true true true true
true true

字符串的规则很简单:长度为 0 才是假值。'0'、'false'、一个空格,长度都不是 0,所以都是真值。对象更直接,只要是对象就是真值,引擎根本不看里面装了什么。这个判断是查表完成的,不会调用对象的任何方法,所以哪怕 new Boolean(false) 内部存的是 false,它也是真值。

为什么 [] 是真值却 == false

最后一行的 Boolean([]) 是 true,但 [] == false 也是 true,看起来自相矛盾。原因是这两处用的规则不一样。

if ([]) 用的是 ToBoolean,查表,对象就是真。[] == false 用的是宽松相等的规则,它不会把两边转成布尔值,而是把布尔值转成数字:false 变成 0;数组转原始值变成 '',再转数字也是 0。最后比较的是 0 == 0。

所以写代码时不要用 == true、== false 去判断真假,想判断真假就直接 if (x),想判断具体值就用 ===。

回答前,多想一步

容易答错的地方

漏掉 -0、0n 和 NaN
很多人只背「0、空串、null、undefined、false」五个。-0 和 0 在大部分场景表现一样,0n 是 BigInt 的零,NaN 是运算失败的结果,这三个在列完整名单时经常被漏掉。
以为空数组、空对象是假值
在 Python 里空列表是假值,所以有这种直觉很正常。JavaScript 里判断数组是否为空要写 arr.length === 0,判断对象是否为空要用 Object.keys(obj).length === 0。
用 if (count) 判断数值是否存在
count 为 0 时会走进 else,很多「数量为 0 时不显示」的 bug 就是这样来的。只想排除 null 和 undefined 时,用 count != null 或 ??。
试着用自己的话回答

面试官还会怎么问?

!!x 和 Boolean(x) 有区别吗?

没有。两者都执行 ToBoolean,结果完全一样。!! 更短,Boolean 语义更清楚,也可以直接传给 filter,比如 arr.filter(Boolean) 能一次去掉所有假值。

document.all 为什么是假值?

早年的代码常写 if (document.all) 来判断是不是老 IE。后来其他浏览器也实现了 document.all 以兼容依赖它的页面,但又不想让这些页面误以为自己在 IE 里,于是规范规定它在 ToBoolean 时为假,typeof 返回 'undefined'。

React 里 {count && <List />} 为什么会渲染出一个 0?

&& 左边为假时返回左边的值本身。count 是 0 时表达式的结果就是 0,React 会把数字 0 渲染出来(false、null、undefined 才不会渲染)。改成 count > 0 && ... 或三元表达式。

从一道题,走向一组知识

把知识连起来

值与类型

new Boolean(false) 和 false 有什么区别?放进 if 里会怎样?

new Boolean(false) 是对象,所以是真值,这是假值名单最经典的反例。

值与类型

charAt、charCodeAt 和 codePointAt 有什么区别?处理 emoji 该用哪个?

字符串是真是假只看长度,charAt 越界返回的空串就是一个会让 if 判断走进 else 的假值。

参考资料

  • JavaScript:值与类型参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 名单之外的全是真值
  3. 为什么 [] 是真值却 == false
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑