前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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值与类型

字符串和数字、布尔值用加号拼接时,到底是怎么转换的?

+ 两边只要有一个是字符串,另一边就转成字符串再拼接;两边都不是字符串时按数字相加。加号从左往右算,所以 1 + 2 + '3' 是 '33','1' + 2 + 3 是 '123'。

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

`+` 运算的判断顺序

  1. 转原始值对象、数组先调用 valueOf 和 toString,拿到原始值
  2. 看有没有字符串任意一边是字符串,另一边用 String() 规则转换后拼接
  3. 否则转数字true 转 1,null 转 0,undefined 转 NaN,再相加

Date 对象是例外,它转原始值时优先用 toString,所以 new Date() + 1 得到的是日期字符串后面拼了一个 1,而不是时间戳加 1。

核心回答

先记住这个答案

+ 是 JavaScript 里唯一一个既能做加法又能做拼接的运算符。它先把两边转成原始值,只要其中一个是字符串,就把另一个也转成字符串,然后拼起来;两边都不是字符串,就都转成数字相加。多个 + 连写时从左往右一步步算,所以结果取决于字符串出现在哪个位置。

  • 只要一边是字符串,+ 就做拼接
  • 从左到右逐步计算,前面先算出的结果决定后面
  • 对象和数组先转原始值,通常变成字符串
  • 减、乘、除只做数字运算,'5' - 2 是 3

位置不同,结果就不同

面试最常考的就是几个字面量混着加,关键是按顺序一步一步算,不要一眼看全。

几组对照JavaScript
console.log(1 + 2 + '3')          // 先算 1 + 2 = 3,再和 '3' 拼接
console.log('1' + 2 + 3)          // 第一步就变成 '12',后面全是拼接
console.log('a' + true, 'a' + null, 'a' + undefined)
console.log(1 + true, 1 + null, 1 + undefined)
console.log('x' + [1, 2], 'x' + {})
console.log(JSON.stringify([] + []), [] + {})
console.log('5' - 2, '5' * '2')   // 只有 + 会拼接
查看输出与解释
33
123
atrue anull aundefined
2 1 NaN
x1,2 x[object Object]
"" [object Object]
3 10

第一行 1 + 2 两边都是数字,先得到 3,再遇到字符串才开始拼接。第二行一开头就是字符串,之后每一步左边都是字符串,所以一路拼下去。 没有字符串参与时,布尔值、null、undefined 走的是数字转换:true 是 1,null 是 0,undefined 是 NaN。一旦有字符串参与,它们就按字面变成 'true'、'null'、'undefined'。

对象和数组是怎么变成字符串的

对象参与 + 时,引擎先把它转成原始值。普通对象和数组的 valueOf 返回的还是对象本身,不是原始值,于是接着调用 toString。数组的 toString 相当于 join(','),所以 [1, 2] 变成 '1,2',空数组变成空字符串;普通对象的 toString 返回 '[object Object]'。

这就解释了 [] + [] 是空字符串、[] + {} 是 '[object Object]'。两边转完原始值后已经是字符串了,自然走拼接。

自定义对象的拼接结果
如果对象自己定义了 valueOf 或 toString,拼接结果就由它们决定。比如给一个金额对象写 toString() { return '¥' + this.amount },那 '价格:' + price 就会输出带货币符号的文本。更精细的控制可以用 Symbol.toPrimitive,它会收到 'string'、'number'、'default' 这样的提示,+ 传的是 'default'。

项目里怎么写更稳

表单里拿到的值都是字符串。input.value + 1 得到的是 '101' 这种结果,而不是 11,这是线上很常见的 bug。求和前先用 Number() 或一元加号转成数字,再相加。

拼接展示文本时,优先用模板字符串,把变量写成 ${count} 插进去。它明确表达「我要拼字符串」,里面的表达式会先按原本的类型算完,再整体转成字符串,读的人不用去推 + 的顺序。

回答前,多想一步

容易答错的地方

以为 + 会优先做数字加法
有人觉得 '1' + 2 会把 '1' 转成数字得到 3。实际规则正好相反,有字符串就拼接。只有减号、乘号、除号、取余这些运算符才会把字符串转成数字,所以 '5' - 2 是 3,'5' + 2 是 '52'。
认为 null 拼接后是空字符串
'a' + null 是 'anull','a' + undefined 是 'aundefined'。页面上出现「用户名undefined」通常就是这个原因。需要兜底时写 name ?? '',不要指望拼接自己吞掉空值。
把 {} + [] 当成表达式来算
在控制台直接敲 {} + [],开头的 {} 会被当成空代码块,实际执行的是 +[],结果是 0。放进括号或赋值语句里,它才是真正的加法,结果是 '[object Object]'。
试着用自己的话回答

面试官还会怎么问?

1 + - + + + - + 1 是多少?

除了第一个 +,后面都是一元运算符,从右往左作用在最后的 1 上。两个负号抵消,得到 1 + 1,结果是 2。

模板字符串和 + 拼接,转换规则一样吗?

基本一样,都是把值转成字符串。区别在于模板字符串对插值结果直接做字符串转换,而 + 走的是「先转原始值,提示为 'default'」。对定义了 Symbol.toPrimitive 的对象,两者可能得到不同结果。另外 Symbol 用 + 拼接和放进模板字符串都会抛 TypeError,要显式调用 String(sym)。

大量字符串拼接要不要改用数组 join?

以前的老 IE 里数组 join 更快,现在的引擎对 += 做了优化,性能差别很小。循环里拼 HTML 这类场景,选可读性好的写法就行,真遇到瓶颈再用性能面板测。

从一道题,走向一组知识

把知识连起来

值与类型

字符串里怎么用转义写 Unicode 字符?反斜杠本身又该怎么写?

拼接多行文本时常用 \n,顺便弄清转义序列和反斜杠本身怎么写。

值与类型

字符串是原始类型,为什么还能用下标取字符?能用下标改吗?

拼接会生成新字符串,这和字符串不可变、下标赋值无效是同一件事。

参考资料

  • JavaScript:值与类型参考资料

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

本题目录
  1. 先记住这个答案
  2. 位置不同,结果就不同
  3. 对象和数组是怎么变成字符串的
  4. 项目里怎么写更稳
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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