在ES6中,`Set`和`WeakSet`是两种新的数据结构,它们与数组类似,但具有不同的特性。本文将详细介绍如何使用这两种数据结构。 `Set`是一个存储唯一值的集合,这意味着它不会包含重复的元素。创建一个`Set`实例,可以使用`new Set()`构造函数。例如: ```javascript var s = new Set(); [2, 2, 2, 5, 8, 16, 2, 1].map(x => s.add(x)); for (i of s) { console.log(i); // 输出:2, 5, 8, 16, 1 } ``` `Set`可以接受一个数组作为构造参数来初始化成员: ```javascript var s = new Set([1, 2, 3, 4, 2, 4, 3]); [...s] // 输出:[1, 2, 3, 4] ``` 向`Set`中添加值时,不会进行类型转换,因此5和"5"被视为不同的值。`Set`内部使用严格相等运算符`===`来判断值是否相等,这意味着即使两个对象内容相同,只要引用不同,它们就被视为不相等。唯一例外是`NaN`,因为`NaN !== NaN`。 ```javascript let set = new Set(); set.add({}).size // 1 set.add({}).size // 2 ``` `Set`具有以下属性和方法: 1. `Set.prototype.size`: 返回`Set`实例的成员数量。 2. `Set.prototype.constructor`: 默认的构造`Set`函数。 操作方法包括: - `add(value)`: 添加值,并返回`Set`结构本身。 - `delete(value)`: 删除值,返回一个布尔值,表示是否删除成功。 - `has(value)`: 返回一个布尔值,表示参数是否为`Set`的成员。 - `clear()`: 清除所有成员,无返回值。 例如: ```javascript var set = new Set(); set.add(1).add(2).add(22).add(22); set.size // 3 set.has(22) // true set.has(4) // false set.delete(2) // true ``` `Set`的遍历操作包括: - `keys()`: 返回键名的遍历器,与`values()`相同,因为`Set`没有键名。 - `values()`: 返回值的遍历器。 - `entries()`: 返回键值对的遍历器。 - `forEach(callbackFn[, thisArg])`: 使用回调函数遍历每个成员。 `Set`默认可遍历,其默认遍历器生成函数是`values()`方法。这意味着可以省略`values()`,直接使用`for...of`循环。 ```javascript var set = new Set([1, 2, 3, 4]); for (let x of set) { console.log(x); } // 输出:1, 2, 3, 4 ``` 扩展运算符(...)可以用于`Set`结构,它会展开`Set`的成员。 ```javascript let set = new Set(['red', 'green', 'blue']); let arr = [...set]; // ['red', 'green', 'blue'] ``` `Set`可以实现并集、交集和差集操作: ```javascript let set1 = new Set([1, 2, 3, 4, 5, 6]); let set2 = new Set([4, 5, 6, 7, 8, 9]); // 并集 let union = new Set([...set1, ...set2]); // [1, 2, 3, 4, 5, 6, 7, 8, 9] // 交集 let intersect = new Set([...set1].filter(x => set2.has(x))); // [4, 5, 6] // 差集 let difference = new Set([...set1].filter(x => !set2.has(x))); // [1, 2, 3] ``` `forEach`的使用与数组类似,可以对`Set`中的每个成员执行操作: ```javascript let set = new Set([1, 2, 3, 4]); set.forEach((value, key) => { console.log(`Value: ${value}, Key: ${key}`); }); ``` `WeakSet`与`Set`类似,但它只能存储对象,且对象的引用是弱引用。这意味着,当对象被其他引用完全释放后,`WeakSet`中的对象也会自动被垃圾回收,即使`WeakSet`仍然存在。由于弱引用的特性,`WeakSet`无法遍历,不支持`size`属性和`forEach`方法。 `Set`和`WeakSet`在ES6中为开发者提供了新的数据管理工具,`Set`用于存储唯一值,适合需要避免重复的情况;而`WeakSet`用于存储弱引用的对象,适用于内存管理敏感的场景。
- 粉丝: 6
- 资源: 936
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 包含 Andrei Neagoie 的《从零到精通掌握编码面试 - 数据结构 + 算法》课程的所有代码示例,使用 Python 语言 .zip
- 数据库课程设计(图书馆管理系统)springboot+swing+mysql+mybatis
- C++ Vigenère 密码(解密代码)
- zblog日收站群,zblog泛目录
- C++ Vigenère 密码(加密代码)
- Vue Router 是 Vue 生态系统的一部分,是一个 MIT 许可的开源项目,其持续开发完全在赞助商的支持下成为可能 支持 Vue 路由器
- PM2.5 数据集 包含上海、成都、广州、北京、沈阳五地的PM2.5观测,csv文件
- 电动汽车与软件定义汽车(SDV)时代的汽车行业数字化转型
- C的两数相加求和的程序代码
- 使用特定版本的 Python 设置 GitHub Actions 工作流程.zip