Set中的add()方法和数组的push()方法有什么区别?

简介: Set中的add()方法和数组的push()方法有什么区别?

在 JavaScript 中,Setadd() 方法和数组的 push() 方法都可用于添加元素,但它们在数据结构、功能和行为上存在本质区别。以下是详细对比:

一、核心区别概览

特性 Set.prototype.add() Array.prototype.push()
数据结构 无序唯一值集合(无索引) 有序列表(有索引)
重复元素处理 自动过滤重复值(基于 === 允许添加重复值
返回值 返回 Set 本身(支持链式调用) 返回新数组长度
元素顺序 按添加顺序排列(遍历时保持) 按插入位置排序(索引决定顺序)
性能(大数据量) 插入/查找效率高(O(1) 时间复杂度) 插入效率低(尾部 O(1),中间/头部 O(n))
访问方式 无索引,通过 has() 检查存在性 通过索引访问元素(如 arr[0]

二、具体差异详解

1. 重复元素处理

  • Set.add():自动去重,确保元素唯一性。

    const set = new Set();
    set.add(1).add(1); // 第二次添加无效
    console.log([...set]); // [1]
    
  • Array.push():允许重复元素。

    const arr = [];
    arr.push(1, 1);
    console.log(arr); // [1, 1]
    

2. 返回值与链式调用

  • Set.add():返回 Set 本身,支持链式调用。

    const set = new Set();
    set.add(1).add(2).add(3); // 链式添加
    
  • Array.push():返回新数组长度。

    const arr = [];
    const length = arr.push(1, 2);
    console.log(length); // 2
    

3. 元素顺序与访问

  • Set:无索引,遍历顺序由添加顺序决定。

    const set = new Set();
    set.add(3).add(1).add(2);
    console.log([...set]); // [3, 1, 2](按添加顺序)
    
  • Array:依赖索引,可随机访问。

    const arr = [];
    arr.push(3, 1, 2);
    console.log(arr[1]); // 1(按索引访问)
    

4. 性能差异

  • Set:插入和查找元素的时间复杂度为 O(1),适合频繁检查元素存在性的场景。

    // 检查元素是否存在
    console.log(set.has(1)); // O(1)
    
  • Array:检查元素存在性需遍历数组(如 includes()),时间复杂度为 O(n)。

    console.log(arr.includes(1)); // O(n)
    

三、应用场景对比

场景 推荐使用 Set 推荐使用 Array
存储唯一值集合 ✅ 自动去重 ❌ 需手动检查重复
频繁检查元素存在性 ✅ O(1) 时间复杂度 ❌ O(n) 时间复杂度
需要按索引随机访问元素 ❌ 无索引支持 ✅ 索引访问高效
维护元素插入顺序 ✅ 遍历时保持添加顺序 ✅ 索引严格控制顺序
处理大数据量 ✅ 插入/删除效率高 ❌ 中间插入/删除性能较差

四、示例对比

1. 数组去重

// 使用 Set
const uniqueArray = [...new Set([1, 2, 2, 3])];
console.log(uniqueArray); // [1, 2, 3]

// 使用 Array(手动去重)
const arr = [1, 2, 2, 3];
const unique = arr.filter((item, index) => arr.indexOf(item) === index);
console.log(unique); // [1, 2, 3](代码更复杂)

2. 检查元素存在性

// Set 更高效
const set = new Set([1, 2, 3]);
console.log(set.has(2)); // true(O(1))

// Array 需遍历
const arr = [1, 2, 3];
console.log(arr.includes(2)); // true(O(n))

3. 维护有序列表

// Array 更适合
const arr = [];
arr.push(3);
arr.push(1);
console.log(arr[0]); // 3(按索引访问)

// Set 无法通过索引访问
const set = new Set();
set.add(3).add(1);
// 需遍历获取元素,无直接索引访问方式

五、总结:如何选择?

  • 使用 Set

    • 需要元素唯一性。
    • 频繁检查元素存在性。
    • 无需按索引访问,只需遍历。
  • 使用 Array

    • 需要维护元素顺序(通过索引控制)。
    • 允许重复元素。
    • 需要随机访问或操作特定位置的元素(如 splice()map() 等)。

理解两者差异后,可根据具体需求灵活选择数据结构,提升代码效率和可读性。

相关文章
|
4月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
326 1
|
5月前
|
存储 安全 JavaScript
如何使用Set的delete()方法删除元素?
如何使用Set的delete()方法删除元素?
484 122
|
5月前
|
存储 安全 JavaScript
如何使用Set的add()方法添加元素?
如何使用Set的add()方法添加元素?
485 58
|
4月前
|
JavaScript 前端开发
如何使用Set的delete()方法删除Set中的所有元素?
如何使用Set的delete()方法删除Set中的所有元素?
285 1
|
5月前
|
存储 编译器 容器
set、map、multiset、multimap的介绍及使用以及区别,注意事项
set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。set默认是升序的,但是其内部默认不是按照大于比较,而是按照小于比较。set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。
227 0
|
11月前
|
Java Maven Spring
【SpringBug】lombok插件失效,但是没有报错信息,@Data不能生成get和set方法
解决写了@Data注解,但是在测试文件中生成的反编译target文件Us二Info中没有get和set方法
891 16
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
103 1
|
20天前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。
|
5月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
287 121