前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库Boolean 包装对象 真值
JavaScript值与类型

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

false 是布尔原始值,new Boolean(false) 是一个对象,只是内部存着 false。对象在条件判断里永远是真值,所以 if (new Boolean(false)) 会进入分支。不加 new 的 Boolean(x) 才是转布尔值的正确写法。

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

原始值和包装对象

  1. 原始值 falsetypeof 为 'boolean',条件判断为假
  2. new Boolean(false)一个对象,内部存着 false,条件判断为真
  3. Boolean(x)当普通函数调用,做类型转换,返回原始值

平时写 true.toString() 能调用方法,是因为引擎临时创建包装对象用完就丢,开发者不需要也不应该手动 new。

核心回答

先记住这个答案

false 是原始值,new Boolean(false) 是用构造函数创建的包装对象,它的 typeof 是 'object'。JavaScript 判断真假时,所有对象都是真值,不会去看对象里存了什么,所以 if (new Boolean(false)) 会执行分支,!new Boolean(false) 是 false。想拿到里面的值要调用 valueOf()。实际开发中不要用 new Boolean,要转布尔值就用不带 new 的 Boolean(x) 或 !!x。

  • new Boolean(false) 仍是对象
  • 对象永远是真值,包装的内容不影响判断
  • valueOf() 才能取出里面的 false
  • Boolean(x) 不加 new 返回原始布尔值

看它在各种场景下的表现

同一个 new Boolean(false),在不同运算里表现不一样,这正是它容易出 bug 的原因。

包装对象和原始值的对照JavaScript
const prim = false
const obj = new Boolean(false)

console.log(typeof prim, typeof obj)
console.log(obj ? '进入 if' : '没进 if')   // 条件判断
console.log(obj.valueOf(), obj === false) // 取值和严格相等
console.log(obj == false)                 // 宽松相等
console.log(new Boolean(false) === new Boolean(false))
console.log(typeof Boolean(0), Boolean(0)) // 不加 new
查看输出与解释
boolean object
进入 if
false false
true
false
boolean false

条件判断只看它是不是对象,所以进了分支。=== 要求类型相同,对象和原始值永远不严格相等。== 会把对象转成原始值,调用 valueOf() 拿到 false 再比较,于是得到 true。两个 new Boolean(false) 是两个不同的对象,比较的是引用,所以不相等。同一个值,在 if 里是真,在 == false 里也是真,这种不一致就是包装对象最大的坑。

包装对象到底有什么用

原始值本身没有属性和方法,但我们天天写 'abc'.length、true.toString()。能这么写,是因为访问属性时引擎会临时把原始值包装成对应的对象,调用完方法就丢掉。这个过程叫自动装箱,开发者感知不到。

所以包装对象的存在是为了给原始值提供方法,不是为了让开发者手动创建。Boolean、Number、String 这三个构造函数带 new 调用会得到对象,不带 new 就是类型转换函数。Symbol 和 BigInt 这两个较新的类型干脆不允许 new,就是吸取了这个教训。

回答前,多想一步

容易答错的地方

以为 new Boolean(false) 是假值
它是对象,而所有对象都是真值。唯一的例外是浏览器的 document.all,和这里无关。
以为 Boolean(x) 和 new Boolean(x) 一样
差一个 new,一个返回原始布尔值,一个返回对象。代码审查时看到 new Boolean、new Number、new String 基本都可以直接当 bug 处理,ESLint 的 no-new-wrappers 规则就是专门拦这个的。
以为 obj == false 为真就说明它是假值
== 走的是转原始值再比较的规则,和条件判断的 ToBoolean 是两回事。[] == false 也是 true,但 [] 同样是真值。
试着用自己的话回答

面试官还会怎么问?

给原始值加属性为什么不生效?

比如 const s = 'a'; s.foo = 1; console.log(s.foo) 输出 undefined。赋值时引擎创建了一个临时包装对象,属性加在了它身上,语句结束这个对象就被丢了。下一次访问又是一个新的包装对象。严格模式下这种赋值会直接抛 TypeError。

Object(false) 和 new Boolean(false) 一样吗?

结果一样,都是 Boolean 包装对象。Object(x) 对原始值会返回对应的包装对象,对对象则原样返回,所以有时用来统一把值转成对象再操作。

怎么判断一个值是 Boolean 包装对象?

typeof 只能得到 'object'。可以用 Object.prototype.toString.call(v),包装对象和原始值都会返回 '[object Boolean]',再配合 typeof v === 'object' 就能区分出包装对象。

从一道题,走向一组知识

把知识连起来

值与类型

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

包装对象 new String('a') 同样是对象,charAt 这些方法能在原始字符串上调用,靠的正是临时包装。

值与类型

为什么 [] == ![] 是 true,而 [] == [] 是 false?

[] == ![] 和 new Boolean(false) 背后是同一条规则:对象转布尔永远是 true。

参考资料

  • JavaScript:值与类型参考资料

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

本题目录
  1. 先记住这个答案
  2. 看它在各种场景下的表现
  3. 包装对象到底有什么用
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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