Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

介绍下 Set、Map、WeakSet 和 WeakMap 的区别? #13

Open
lvwxx opened this issue Jul 25, 2019 · 0 comments
Open

介绍下 Set、Map、WeakSet 和 WeakMap 的区别? #13

lvwxx opened this issue Jul 25, 2019 · 0 comments
Labels
basic JavaScript basic knowledge must konw question Further information is requested

Comments

@lvwxx
Copy link
Owner

lvwxx commented Jul 25, 2019

Set

定义

Set在其他语言中又叫做集合,是由一堆无序的、相关联的,且不重复的内存结构组成的组合。

根据定义可以得出几个关键点:

  • 集合中的元素无序且唯一
  • 集合中的元素可以是任何类型,无论是原始值还是对象引用

Set 的实例属性和方法

  • size: 返回集合中所包含的元素的数量

  • add(value): 向集合中添加一个新的项

  • delete(value): 从集合中删除一个值

  • has(value): 如果值在集合中存在,返回ture, 否则返回false

  • clear(): 移除集合中的所有项

  • keys(): 返回键名的遍历器

  • values(): 返回键值的遍历器 (由于 Set 没有键名只有键值,所有 keys 和 values 效果一致)

  • entries(): 返回键值对的遍历器

  • forEach(): 使用回调函数遍历每个成员

Set 的基本用法

Set 本身是一个构造函数,用来生成Set结构

const s = new Set()

[1,2,3,4,4].forEach(i => s.add(i))

for(let i of s) {
  console.log(i)
}

// output: 1 2 3 4
// Set不会添加重复元素

上面代码可以看出 Set 用途之一是可以去除数组中的重复元素

Set 构造函数还可以接受一个数组(或具有 iterable 接口的其他数据结构)作为参数,用来初始化一个集合。

// 例 1
const s = new Set([1,2,3,4,5,5,4,'5'])

[...s]  // [1,2,3,4,5,'5']  
// 注意 向 Set 中加入值的时候不会发生类型转换, Set内部用 (===) 来判断两个值是否相等

// 例 2

const m = new Map()
m.set('a', 1)
m.set('a', 2)

const s = new Set(m)

[...s] // [['a', 1], ['b', 2]]

Array.from(s) // [['a', 1], ['b', 2]]  Array.from方法可以将 Set 转为数组

WeakSet

定义

WeakSet 结构与 Set 类似,也是不重复的值的集合

与 Set 的区别

  • WeakSet 中的元素只能是对象,不能是其他类型的值
  • WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果该对象不在被其他变量引用,那么垃圾回收机制就会自动回收该对象所占用内存,所以只要 WeakSet 成员对象在外部消失,它们在 WeakSet 里面的引用就会自动消失。
  • 由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历。

Map

定义

类似于对象,也是键值对的集合

与对象(Object)的区别:

  • 对象的键只能是字符串,Map 的键可以是任意类型

Map 的实例属性和方法

  • size: 返回 Map 结构的元素总数

  • set(key, value): 向 Map 中加入或更新键值对

  • get(key): 读取 key 对用的值,如果没有,返回 undefined

  • has(key): 某个键是否在 Map 对象中,在返回 true 否则返回 false

  • delete(key): 删除某个键,返回 true, 如果删除失败返回 false

  • clear(): 删除所有元素

  • keys():返回键名的遍历器

  • values():返回键值的遍历器

  • entries():返回所有成员的遍历器

  • forEach():遍历 Map 的所有成员

Map 基本用法

const m = new Map()

m.set('a', 1)
m.set(1: 'a')

m.get('a') // 1
m.has(1) // true
m.size() // 2
const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
])

for (let key of map.keys()) {
  console.log(key)
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value)
}
// "no"
// "yes"

for (let [key, value] of map) {
  console.log(key, value)
}
// "F" "no"
// "T" "yes"

[...map]  // [['F', 'no'], ['T', 'yes']]

WeakMap

定义

WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。

WeakMap 和 Map 区别

  • WeakMap 只接受对象作为键名(不包括null)
  • WeakMap 键名所指向的对象,不计入垃圾回收机制(同 WeakSet)

结论

  • Set、Map、WeakSet、WeakMap、都是一种集合的数据结构
  • Set 和 WeakSet 是一种值-值的集合,且元素唯一不重复
  • Map 和 WeakMap 是一种键-值对的集合,Map 的键可以是任意类型,WeakMap 的键只能是对象类型。
  • Set 和 Map可遍历,WeakSet 和 WeakMap不可遍历
  • WeakSet 和 WeakMap 键名所指向的对象,不计入垃圾回收机制
@lvwxx lvwxx added basic JavaScript basic knowledge must konw question Further information is requested labels Aug 8, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
basic JavaScript basic knowledge must konw question Further information is requested
Projects
None yet
Development

No branches or pull requests

1 participant