Array.join处理嵌套数组时,为何8、9后无空格?
问题原因解析
这是因为Array.join()只会处理当前层级的数组元素,当元素本身是嵌套数组时,JS会自动调用该子数组的toString()方法转成字符串——而数组的toString()默认是用无空格的逗号来拼接自身元素的。
咱们拿你的代码实例拆解一下:
原数组是[5, 6, [7], ["8", ["9", ["10" ]]]],调用join(", ")时的执行流程是:
- 先处理前三个元素:5、6、[7]。其中[7]调用
toString()变成"7",这部分拼接后得到"5, 6, 7" - 第四个元素是嵌套数组
["8", ["9", ["10"]]],它调用toString()时,会先处理自己的子元素:- 第一个子元素是字符串"8",直接保留
- 第二个子元素是
["9", ["10"]],它的toString()会把自身元素拼接成"9,10"(无空格逗号) - 所以整个
["8", ["9", ["10"]]]转成字符串后是"8,9,10"
- 最后把前半部分和第四部分用
", "拼接,就得到了"5, 6, 7, 8,9,10"——这就是为什么8和9、9和10之间没有空格。
如果想要真正扁平化数组后再用带空格的逗号拼接,得先处理多层嵌套,比如用Array.flat()(指定深度为Infinity处理所有层级),修改函数如下:
function flattenArray(a) { // 先扁平化所有层级的嵌套数组 let flattened = a.flat(Infinity); return flattened.join(", "); } const nestedNums = [5, 6, [7], ["8", ["9", ["10" ]]]]; const flatNums = flattenArray(nestedNums); console.log(flatNums); // 输出:5, 6, 7, 8, 9, 10
内容的提问来源于stack exchange,提问作者Kelvin Parakhiya
相关产品推荐
相关产品推荐

