前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库数组 toString 与 join 区别
JavaScript数组与集合

数组的 toString 和 join 有什么区别,嵌套数组真的被展平了吗?

数组的 toString() 内部调用的就是 join(),所以 arr.toString() 和 arr.join() 结果一样,都用逗号连接。区别是 join 可以指定分隔符。嵌套数组看起来被展平,只是内层数组也转成了字符串,数组结构本身没变。

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

数组转字符串分两步

  1. 元素转字符串每个元素各自转换,嵌套数组也按逗号连接
  2. 插入分隔符join 的参数只插在最外层元素之间
  3. 原数组不变结果只是一个字符串,数组的层级没有被改动

join 的分隔符管不到内层数组。[[1, 2], 3].join('|') 得到的是 1,2|3,内层的逗号还在。

核心回答

先记住这个答案

数组的 toString() 内部直接调用 this.join(),所以不传参数时两者结果完全一样,都是用逗号把元素连起来。join 多了一个能力:可以指定分隔符,比如 join('-') 或 join('')。转换时 null 和 undefined 会变成空字符串,但分隔符还保留着。嵌套数组的结果看起来像被展平了,实际上是内层数组也被转成了逗号连接的字符串,原数组的结构一点没变。

  • toString() 等于不传参数的 join()
  • join 能换分隔符,只影响最外层
  • null 和 undefined 在结果里变成空字符串
  • 转字符串会丢类型和层级,不能当序列化用

嵌套、空值和自定义 join

下面这个数组里既有嵌套数组,又有 null 和 undefined,最后还演示了改写 join 对 toString 的影响。

外层分隔符管不到内层JavaScript
const values = [[1, 2], null, undefined, 3]

console.log(values.join('|'))      // 外层用竖线
console.log(values.toString())     // 等于 join()
console.log(values.length, Array.isArray(values[0]))  // 数组本身没变

const custom = [1, 2]
custom.join = () => 'custom text'  // 改写实例上的 join
console.log(custom.toString())     // toString 调用的是当前的 join
查看输出与解释
1,2|||3
1,2,,,3
4 true
custom text

第一行里外层用了竖线,内层 [1, 2] 还是逗号,因为内层数组是自己调用 toString() 转成 "1,2" 的,外层的分隔符传不进去。null 和 undefined 变成了空字符串,所以能看到连续的竖线。第三行说明数组还是 4 项,第一项还是数组,转字符串没有改动任何结构。 最后一行说明 toString() 不是固定执行内置的 join,而是调用对象上当前的 join 方法。如果 join 被改成一个不是函数的值,toString() 会退回到 Object.prototype.toString,得到 "[object Array]"。

为什么 join 的结果不能当数据格式

join 的结果是给人看的,信息已经丢了。比如 [1, 2] 和 ['1,2'] 转出来都是 "1,2"。null 和 undefined 转出来是空,空字符串和空位也是空。拿到字符串再 split(','),没法知道原来是数字还是字符串,有没有嵌套。

需要还原就用 JSON
要把数组存进 localStorage、放进 URL 或者发给后端,用 JSON.stringify。[[1, 2], null, 3] 转成 JSON 是 [[1,2],null,3],层级和类型都保留,JSON.parse 能原样还原。 导出 CSV 也不能只靠 join(',')。字段里本来就有逗号、引号或换行时,要按 CSV 规则用双引号包起来并转义,否则表格软件会把一个字段拆成好几列。
回答前,多想一步

容易答错的地方

说 toString() 把嵌套数组展平了
得到的只是一个字符串,原数组还是嵌套的。真正要展平数组,用 flat(),比如 [[1, 2], 3].flat() 得到 [1, 2, 3],这才是一个新的一维数组。
以为 join('') 能去掉所有逗号
join('') 只去掉最外层的分隔符。[[1, 2], 3].join('') 的结果是 "1,23",内层数组转换时产生的逗号还在。想全部去掉,先 flat(Infinity) 再 join('')。
试着用自己的话回答

面试官还会怎么问?

[] + [] 和 [] + {} 分别是什么?

+ 两边是对象时会先转成原始值,数组转出来走的就是 toString()。空数组转成空字符串,所以 [] + [] 是空字符串,而 [] + {} 是 "[object Object]"。

String([null]) 和 String(null) 一样吗?

不一样。String(null) 是 "null",而数组里的 null 在 join 时会变成空字符串,所以 String([null]) 是 ""。undefined 同理。

模板字符串里直接放数组会怎样?

${arr} 会调用数组的 toString(),得到逗号连接的结果。想要别的格式,比如用顿号或换行连接,要自己写 arr.join('、')。

从一道题,走向一组知识

把知识连起来

数组与集合

concat 和展开运算符合并数组有什么区别?嵌套数组和空位怎么处理?

要真正把嵌套数组合并展开,看 concat 和展开运算符怎么处理嵌套,而不是靠转字符串。

数组与集合

JSON.stringify(Map) 为什么得到空对象,怎样可靠保存再恢复?

需要把数据存起来再原样恢复时,该用 JSON 这类明确的格式,那篇讲 Map 怎么做。

参考资料

  • MDN:Array.toString
  • MDN:JSON.stringify

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

本题目录
  1. 先记住这个答案
  2. 嵌套、空值和自定义 join
  3. 为什么 join 的结果不能当数据格式
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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