Set无序但按插入顺序遍历,无索引访问;首元素用set.values().next().value,末元素推荐Array.from(set).at(-1),空集需判空,不可用数组语法。

JavaScript 的 Set 本身是无序集合(ES2015+ 规范中实际按插入顺序遍历),不支持通过索引直接访问元素,也没有内置的 first() 或 last() 方法。要获取第一个或最后一个元素,需借助迭代器或转换为数组。
获取第一个元素
利用 Set.prototype.values() 返回的迭代器,调用 next().value 即可拿到插入顺序中的首个元素:
const set = new Set(['a', 'b', 'c']); const first = set.values().next().value; // 'a' // 或简写为: // const first = set[Symbol.iterator]().next().value;
⚠️ 注意:如果 Set 为空,next().value 会是 undefined,建议先判断 set.size > 0。
获取最后一个元素
由于 Set 不支持反向遍历,最直接的方式是转成数组再取末尾:
立即学习“Java免费学习笔记(深入)”;
-
Array.from(set).at(-1)(推荐,简洁且兼容性较好,IE 不支持at()) -
[...set].slice(-1)[0](兼容性更广,但创建了完整数组,大数据量时有性能开销) -
Array.from(set).pop()(会修改原数组副本,不推荐仅读取时使用)
示例:
const set = new Set([1, 2, 3, 4]); const last = Array.from(set).at(-1); // 4
避免常见误区
Set 不是数组:不能用 set[0]、set.length 或 set.at(0);
没有“逻辑首尾”概念:Set 的顺序是插入顺序,不是排序结果;若需按值排序后取首尾,应先转数组并排序;
性能考虑:对大 Set 频繁取“最后一个”,用 Array.from(set).at(-1) 比 [...set].at(-1) 稍优(前者更明确意图,引擎优化可能更好)。
封装成可复用工具函数
可以简单封装,提升可读性和健壮性:
const setFirst = (s) => s.size === 0 ? undefined : s.values().next().value;
const setLast = (s) => {
if (s.size === 0) return undefined;
return Array.from(s).at(-1);
};
// 使用
const s = new Set([10, 20, 30]);
console.log(setFirst(s)); // 10
console.log(setLast(s)); // 30


















