ES6 Set/WeakSet

ES6里加入了一个新数据解构Set,和Java的Set一样,它里面不存放重复的元素。Set实现为一个,使用时需要先new。

var s1 = new Set()
s1.add(1)
s1.add(2)
s1.add(3)
s1.add(1)

var s2 = new Set()
s2.add(‘a‘)
s2.add(‘a‘)

// 输出1,2, 3
for (var i of s1 ) {
	console.log(i)
}
// 输出a
for (var i of s2 ) {
	console.log(i)
}

上面用Set的add方法添加元素,重复添加的,不会存进去。

Set构造器还可以接受数组作为参数传入

var s3 = new Set([1,2,3,1])
s3.size // 3

可以看到重复的数字1依然没有放进去,另外取Set的长度使用size,不是length。

需要注意的是对于{}或[],它们是两个同的对象

var s4 = new Set()
s4.add({})
s4.add({})
s4.size // 2

一、遍历Set (for of)

var s1 = new Set()
s1.add(1)
s1.add(2)
s1.add(3)

// 输出1,2, 3
for (var i of s1) {
	console.log(i)
}

二、把Set转成数组

var s1 = new Set()
s1.add(1)
s1.add(2)

// toArray
var a1 = Array.from(s1)
Array.isArray(a1) // true

// or
var a1 = [...new Set(s1)]

  

三、利用Set给数组去重

function distinct(arr) {
	return Array.from(new Set(arr))
//	return [...new Set(arr)]
}

Set的属性

  • constructor
  • size

Set的方法

  • has(val) 判断是否存在该元素
  • add(val) 添加元素
  • delete(val) 删除元素
  • clear 删除所有元素
  • keys
  • values
  • entries
  • forEach 遍历元素
  • map
  • filter

四、WeakSet

WeakSet和Set一样都不存储重复的元素,但有一些不同点

1. 只存储对象类型元素

ws = new WeakSet()
ws.add(1)

FF下报错如下

2. 只有add/delete/clear/has三个方法,不能遍历,没有size属性等

ws = new WeakSet()
ws.size // undefined
ws.forEach // undefined

MDN的解释

WeakSet 对象中存储的对象值都是被弱引用的, 如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉. 正因为这样, WeakSet 对象是无法被枚举的, 没有办法拿到它包含的所有元素

WeakSet主要用来储存DOM节点,当这些节点从文档移除时,不会引发内存泄漏。

相关:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakSet

时间: 2024-08-03 13:53:22

ES6 Set/WeakSet的相关文章

ES6 Set,WeakSet,Map,WeakMap

1. Set Set是一个集合,里面的值都是唯一的,没有重复的.Set中可以是任何数据类型,并且添加数据时会进行严格比较,重复数据无法加入. 2. WeakSet 弱引用Set.只能存储对象,不能存储其他类型.且只保持对其中对象的弱引用,若外部无对此对象的引用,或者对象被删除,则WeakSet中将不再有此对象. 因为成员都是弱引用,随时可能消失,遍历不能保证成员的存在.所以 WeakSet 不能遍历 3. Map Map是一个键值对. Map与Object的区别是: 1. Object的key只

ES6中的Set和Map集合

前面的话 在ES6标准制定以前,由于可选的集合类型有限,数组使用的又是数值型索引,因而经常被用于创建队列和栈.如果需要使用非数值型索引,就会用非数组对象创建所需的数据结构,而这就是Set集合与Map集合的早期实现.本文将详细介绍ES6中的set和map集合 引入 Set集合是一种无重复元素的列表,开发者们一般不会逐一读取数组中的元素,也不太可能逐一访问Set集合中的每个元素,通常的做法是检测给定的值在某个集合中是否存在 Map集合内含多组键值对,集合中每个元素分别存放着可访问的键名和它对应的值,

ES6(简介及常用)-下

八.Iterator 和 for of 值遍历(谷歌浏览器无) 1.Iterator(遍历器)的概念 JavaScript 原有的表示"集合"的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象.这样就需要一种统一的接口机制,来处理所有不同的数据结构.遍历器(Iterator)就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的

es6的Set和Map数据结构

Set 和 Map 数据结构 Set WeakSet Map WeakMap 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 上面代码通过add

ES6之路第九篇:Set和Map数据结构

set 基本用法 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. 1 const s = new Set(); 2 3 [2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x)); 4 5 for (let i of s) { 6 console.log(i); 7 } 8 // 2 3 5 4 上面代码通过add方法向 Set 结构加入成员,结果表明 Set 结构不

ES6的新特性(12)——Set 和 Map 数据结构

Set 和 Map 数据结构 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 上面代码通过add方法向 Set 结构加入成员,结果表明 Set 结构不会

ES6学习之Set 和 Map 数据结构

Set对象 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 实例的属性和方法 Set.prototype.constructor:构造函数,默认就是Set函数. Set.prototype.size:返回Set实例的成员总数 Set.prototype.add(value):添加某个值,返回 Set 结构本身. Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功. Set.prototype.ha

10.Set 和 Map 数据结构

Set 和 Map 数据结构 Set 和 Map 数据结构 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 上面代码通过add方法向 Set 结构加入成

ES6新特性:Javascript中Set和WeakSet类型的数据结构

ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, 以下的一些代码,都可以拷贝到控制台直接运行哦: 创建Set实例的基本方法为: let set = new Set(); //或者 new Set(null); console.log(set); 或者这样: let set = new Set([1,2,3,4,4,4,4,4]); console.log(