ECMAScript 6 学习笔记(九):Set 和 Map

栏目: JavaScript · 发布时间: 7年前

内容简介:ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set 本身是一个构造函数,用来生成 Set 数据结构。

const s = new Set();

[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));

for (let i of s) {
  console.log(i);
}
// 2 3 5 4

Set 函数可以接受一个具有 iterable 接口的其他数据结构作为参数,用来初始化。

const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]

应用

  1. 数组去重
[...new Set(array)]
  1. 字符串去重
[...new Set('ababbc')].join('')

实例的属性和方法

  1. 属性
Set.prototype.constructor
Set.prototype.size
  1. 方法
add(value)
delete(value)
has(value)
clear()

遍历操作

keys()
values()
entries()
forEach()

Set 的遍历顺序就是插入顺序。

Map

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

Set 类似,任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。

// 数组
const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

注意,只有对同一个对象的引用,Map 结构才将其视为同一个键。这一点要非常小心。

const map = new Map();

map.set(['a'], 555);
map.get(['a']) // undefined

let a = ['a'];
map.set(a, 555);
map.get(a) // 555

如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如 0-0 就是一个键,布尔值 true 和字符串 "true" 则是两个不同的键。另外, undefinednull 也是两个不同的键。虽然 NaN 不严格相等于自身,但 Map 将其视为同一个键。

let map = new Map();

map.set(-0, 123);
map.get(+0) // 123

map.set(true, 1);
map.set('true', 2);
map.get(true) // 1

map.set(undefined, 3);
map.set(null, 4);
map.get(undefined) // 3

map.set(NaN, 123);
map.get(NaN) // 123

实例的属性和方法

  1. 属性
Map.prototype.constructor
Map.prototype.size
  1. 方法
  • set(key, value) :设置键名 key 对应的键值为 value ,然后返回整个 Map 结构。如果 key 已经有值,则键值会被更新,否则就新生成该键。
  • get(key) :读取 key 对应的键值,如果找不到 key ,返回 undefined
  • delete(key) :删除某个键,返回一个布尔值,表示删除是否成功。
  • has(key) :返回一个布尔值,表示某个键是否在当前 Map 对象之中。
  • clear() :清除所有成员,没有返回值。

遍历操作

keys()
values()
entries()
forEach()

Map 的遍历顺序就是插入顺序。

WeakSet 和 WeakMap

Weak(Set/Map) 与 Set/Map 类似,只是它们的成员只能是对象,而不能是其他类型的值。其次,Weak(Set/Map) 中的对象都是弱引用,即垃圾回收机制不考虑 Weak(Set/Map) 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 Weak(Set/Map) 之中。因此这两种结构有助于防止内存泄漏。

  1. WeakSet

WeakSet 只可以使用 add()delete()has() 。WeakSet 没有 size 属性,没有办法遍历它的成员。WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了。WeakSet 的一个用处,是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏。

  1. WeakMap

WeakSet 只可以使用 get()set()has()delete() 。也没有 size 数属性,没法执行遍历操作。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Mastering Bitcoin

Mastering Bitcoin

Andreas M. Antonopoulos / O'Reilly Media / 2014-12-20 / USD 34.99

Mastering Bitcoin tells you everything you need to know about joining one of the most exciting revolutions since the invention of the web: digital money. Bitcoin is the first successful digital curren......一起来看看 《Mastering Bitcoin》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具