深切明白ES6笔记(七)Set鸠合和Map鸠合

重要知识点:Set的基础操纵,Weak Set,Map的基础操纵,Weak Map

《深切明白ES6笔记(七)Set鸠合和Map鸠合》

《深切明白ES6》笔记 目次

ES6 的 Set

ES6 供应了新的数据结构 Set。它类似于数组,然则成员的值都是唯一的,没有反复的值。

Set 本身是一个组织函数,用来天生 Set 数据结构。

建立 Set 并增加项目

let set = new Set();
set.add(5);
set.add("5");
console.log(set.size); // 2

能够运用数组来初始化一个 Set ,而且 Set 组织器会确保不反复地运用这些值:

let set = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
console.log(set.size); // 5

运用 has() 要领来测试某个值是不是存在于 Set 中:

let set = new Set();
set.add(5);
set.add("5");
console.log(set.has(5)); // true
console.log(set.has(6)); // false

移除值

运用 delete() 要领来移除单个值,或挪用 clear() 要领来将一切值从 Set 中移除。

let set = new Set();
set.add(5);
set.add("5");
console.log(set.has(5)); // true
set.delete(5);
console.log(set.has(5)); // false
console.log(set.size); // 1
set.clear();
console.log(set.has("5")); // false
console.log(set.size); // 0

Set 上的 forEach() 要领

forEach() 要领会被通报一个回调函数,该回调接收三个参数:

  1. 元素值;
  2. 元素索引;
  3. 目的 Set 本身。
    Set 中的每一项键与值是相称的
let set = new Set([1, 2]);
set.forEach(function(value, key, ownerSet) {
    console.log(key + " " + value);
    console.log(ownerSet === set);
});
// 输出
1 1
true
2 2
true

将 Set 转换为数组

let set = new Set([1, 2, 3, 3, 3, 4, 5]),
array = [...set];
console.log(array); // [1,2,3,4,5]

能够用此要领举行数组去重:

function eliminateDuplicates(items) {
    return [...new Set(items)];
}
let numbers = [1, 2, 3, 3, 3, 4, 5],
noDuplicates = eliminateDuplicates(numbers);
console.log(noDuplicates); // [1,2,3,4,5]

Weak Set

Set的援用范例:对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只需关于 Set 实例的援用依然存在,所存储的对象就没法被渣滓接纳机制接纳,从而没法开释内存。

let set = new Set(),
key = {};
set.add(key);
console.log(set.size); // 1
// 作废原始援用
key = null;
console.log(set.size); // 1
// 从新取得原始援用
key = [...set][0];

当 JS 代码在网页中运转,同时你想坚持与 DOM 元素的联络,在该元素能够被其他剧本移除的状况下,你应该不愿望本身的代码保存对该 DOM 元素的末了一个援用(这类状况被称为内存走漏)。
Weak Set
该范例只允许存储对象弱援用,而不能存储基础范例的值。对象的弱援用在它本身成为该对象的唯一援用时,不会阻挠渣滓接纳:
建立 Weak Set

let set = new WeakSet(),
key = {};
// 将对象到场 set
set.add(key);
console.log(set.has(key)); // true
set.delete(key);
console.log(set.has(key)); // false

和Set的区分:

  • WeakSet 的成员只能是对象,而不能是其他范例的值。
const ws = new WeakSet();
ws.add(1)
// TypeError: Invalid value used in weak set
ws.add(Symbol())
// TypeError: invalid value used in weak set
  • WeakSet 中的对象都是弱援用,即渣滓接纳机制不斟酌 WeakSet 对该对象的援用,也就是说,假如其他对象都不再援用该对象,那末渣滓接纳机制会自动接纳该对象所占用的内存,不斟酌该对象还存在于 WeakSet 当中。
  • Weak Set 不可迭代,因而不能被用在 for-of 循环中;
  • Weak Set 没法暴露出任何迭代器(比方 keys() 与 values() 要领),因而没有任何编程手腕可用于推断 Weak Set 的内容;
  • Weak Set 没有 forEach() 要领;
  • Weak Set 没有 size 属性。

ES6 的 Map

ES6 的 Map 范例是键值对的有序列表,而键和值都能够是恣意范例。

  • 基础用法:
let map = new Map();
map.set("title", "Understanding ES6");
map.set("year", 2016);
console.log(map.get("title")); // "Understanding ES6"
console.log(map.get("year")); // 2016

假如恣意一个键不存在于 Map 中, 则 get() 要领就会返回特别值 undefined

能够将对象作为键,这些键不会被强迫转换成其他情势,每一个对象就都被认为是唯一的

let map = new Map(),
key1 = {},
key2 = {};
map.set(key1, 5);
map.set(key2, 42);
console.log(map.get(key1)); // 5
console.log(map.get(key2)); // 42

Map 的要领

  • has(key) :推断指定的键是不是存在于 Map 中;
  • delete(key) :移除 Map 中的键以及对应的值;
  • clear() :移除 Map 中一切的键与值。

属性:size

let map = new Map();
map.set("name", "Nicholas");
map.set("age", 25);
console.log(map.size); // 2
console.log(map.has("name")); // true
console.log(map.get("name")); // "Nicholas"
console.log(map.has("age")); // true
console.log(map.get("age")); // 25
map.delete("name");
console.log(map.has("name")); // false
console.log(map.get("name")); // undefined
console.log(map.size); // 1
map.clear();
console.log(map.has("name")); // false
console.log(map.get("name")); // undefined
console.log(map.has("age")); // false
console.log(map.get("age")); // undefined
console.log(map.size); // 0

Map 的初始化

将数组通报给 Map 组织器,以便运用数据来初始化一个 Map 。该数组中的每一项也必需是数组,内部数组的首个项会作为键,第二项则为对应值:

let map = new Map([["name", "Nicholas"], ["age", 25]]);
console.log(map.has("name")); // true
console.log(map.get("name")); // "Nicholas"
console.log(map.has("age")); // true
console.log(map.get("age")); // 25
console.log(map.size); // 2

便历要领

  • forEach
let map = new Map([ ["name", "Nicholas"], ["age", 25]]);
map.forEach(function(value, key, ownerMap) {
    console.log(key + " " + value);
    console.log(ownerMap === map);
});
//打印:
name Nicholas
true
age 25
true
    原文作者:sevencui
    原文地址: https://segmentfault.com/a/1190000016119822
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞