你以为迭代器只能吐成数组才能 join?今天 Chrome 154 用一个方法把它彻底原生化了
配了几年 JavaScript,你大概写过这样的代码:
const parts = [1, 2, 3, 4, 5];
const result = parts.filter(n => n % 2 === 0).join(‘-‘); // “2-4”
filter 返回数组,所以 join 能直接用。
但如果你用的是生成器或者迭代器呢?
function* fibonacci() {
let a = 1, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
// 以前只能这样:
const result = […fibonacci().take(5)].join(‘ – ‘); // “1 – 1 – 2 – 3 – 5”
那个展开操作符把整个迭代器吐成了数组,内存里先装了一份,才能 join。这个操作在迭代器很大或者数据源是流的时候,根本不可接受。
Chrome 154 稳定版(2026 年 9 月)给 Iterator.prototype 加了一个 join(),直接省掉这个中间数组。
fibonacci().take(5).join(‘ – ‘); // “1 – 1 – 2 – 3 – 5”
就这一行,没有展开,没有 toArray,没有中间数组。迭代器吐一个,join 就用掉一个,完全惰性。
这个方法是哪来的
这是一个 TC39 Stage 3 提案(proposal-iterator-join),由 Michael Ficarra 提出,Firefox 154 和 Chrome 154 同时稳定。Safari 在开发中。兼容性在 core-js 的 changelog 和 MDN 上都能查到(Firefox 154、Chrome 153+、Bun 1.4+ 已支持)。
join() 的几个细节
第一个参数是分隔符,省略就默认逗号:
[1, 2].values().join(); // “1,2”
[1, 2].values().join(”); // “12”
空迭代器返回空字符串,不报错:
[].values().join(‘-‘); // “”
undefined 和 null 会被转成空字符串:
[1, null, 3].values().join(‘-‘); // “1–3”
和已发文章的区别
09-07 fe_rust 发过「Iterator.concat」(顺序拼接多个可迭代对象),那是把多个迭代器合成一个迭代器。本文 join 是把一个迭代器合成一个字符串,场景完全不同。
09-17 fe_arch 发过「Iterator.zip」(并行遍历),也是 Iterator helpers 家族但完全不同的 API。
怎么用
不需要任何 polyfill,Chrome 154 以上直接写。如果要兼容更老的浏览器,用 core-js 的 polyfill。
记住一个原则:能用迭代器直接操作的,就别展开成数组。内存省的不是一点半点。
评论区
登录后可评论。