You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中Set配合concat返回唯一字符及展开运算符作用疑问

字符串去重JS代码疑问解答

首先贴出你提供的实现代码:

function unique_char(string) {
  return String.prototype.concat(...new Set(string));
}

console.log(unique_char("Hellooooooooooooo")); // 输出结果为Helo

问题1:为什么concat方法配合new Set处理字符串能够得到去重后的字符?为什么拼接不会自动加逗号?

  • 首先Set是ES6引入的集合数据结构,核心特性就是自动去除重复的存储值:当你把字符串传入new Set()时,字符串会被迭代拆分逐个字符存入Set,重复字符会被直接过滤,比如传入"Hellooooooooooooo"得到的Set结构为{'H','e','l','o'}。
  • 你印象中拼接会加逗号的场景,是直接把数组/Set这类可迭代对象作为单个参数传给拼接方法时,可迭代对象默认转字符串会用逗号分隔元素,比如执行concat(Array.from(new Set("Hello")))得到的结果就是"H,e,l,o"。但这里因为使用了展开运算符,把Set的元素拆成了多个独立的字符参数传给concat,concat接收多个独立字符串参数时会按顺序直接拼接,不会额外添加逗号,等价于执行concat('H','e','l','o'),自然得到无逗号的去重字符串。

问题2:为什么new Set前面需要使用展开运算符...?

  • String.prototype.concat的语法规则是接收逐个传入的字符串参数,不支持直接接收Set、数组这类可迭代对象作为单个入参。
  • 展开运算符...的作用就是把Set这类可迭代对象的内部元素,拆分转化为函数调用的独立参数:如果去掉...直接把Set作为参数传给concat,concat会先把整个Set实例转为字符串,最终得到的结果是"[object Set]",完全不符合去重需求。

内容的提问来源于stack exchange,提问作者deagleshot32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:09:00