数据类型:Set、Map、WeakSet、WeakMap、Symbol

304 阅读3分钟

数据类型

总结几种 数据类型

一、Set 和 WeakSet

1.Set

一个集合,有两个特点:

  • Set 中每个值只能出现一次;
  • 可以容纳任何数据类型的任何值
//创建新的 Set 对象
let _set = new Set(['a','b','c'])
console.log(_set)
//向 Set 添加新元素
_set.add('d')
_set.add(123)
//接受对象类型
_set.add({name:"wanwan"})
//接受具有iterable接口的其他数据结构作为参数
_set.add([...document.querySelectorAll('div')])
console.log(_set)
//删除指定的元素
_set.delete('d')
console.log(_set)
//键名-值名
console.log(_set.entries())
//键名
console.log(_set.keys())
//值名
console.log(_set.values())
//相当于数组的length
console.log(_set.size)
//相当于数组的includes
console.log(_set.has('d'))
_set.clear()
console.log(_set)

2.WeakSet

WeakSet 对象是一些对象值的集合, 并且其中的每个对象值都只能出现一次。在WeakSet的集合中是唯一的

它和 Set]对象的区别有两点:

  • Set相比,WeakSet 只能是对象的集合,而不能是任何类型的任意值。
  • WeakSet 是不可枚举的,没有size属性,它的值时根据被引用来决定的。 1652351395(1).png
  • WeakSet持弱引用:集合中对象的引用为弱引用。 如果没有其他的对WeakSet中对象的引用,那么这些对象会被当成垃圾回收掉。
  • 如果一个weakset中的一个对象都不再被引用,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑它还存在于weakSet中。

WeakSet适合临时存放一组对象和对象的相关信息 要理解这句话,看一下下面的例子

    let bar = {name:'bar'}
    let _set = new Set()
    _set.add(bar)
    bar = null
    console.log(_set)

1653462317(1).png

当一个对象被设置为null,那默认这个对象的内存被回收 其实这里能看出,虽然bar这个对象被销毁了,但是存在set的值不受影响

    let bar = {name:'bar'}
    let _wset = new WeakSet()
    _wset.add(bar)
    bar = null
    console.log(_wset[0]) //undefined
    console.log(_wset.has(bar))  //false

*** 值得注意的是,虽然这里打印_wset,仍然可以获取上图一样的结果,这取决于垃圾回收机制。但是实际这里我们已经无法再weakSet中获取bar了。

3.应用

set-多用于数组去重

const fruits = ['apple','banana','strawberry','apple','pear']
console.log(new Set(fruits))
//{ 'apple', 'banana', 'strawberry', 'pear' }

weakset - 创建DOM

为了让垃圾回收程序回收元素的内存,可以在这里使用 WeakSetconst disabledElements = new WeakSet(); 
const loginButton = document.querySelector('#login');
// 通过加入对应集合,给这个节点打上“禁用”标签 
disabledElements.add(loginButton);
这样,只要 WeakSet 中任何元素从 DOM 树中被删除,垃圾回收程序就可以忽略其存在,
而立即释放其内存(假设没有其他地方引用这个对象)。

二、Map对象

1.Map

Map对象的特点:

  • 保存的键值对;
  • 键值可以是任何数据类型,也可以使用对象;
  • 记得键的原始插入顺序;
  • 具有映射大小的属性;
let foo = {name:"foo"}
let bar = {name:"bar"}
let baz = {name:"baz"}
//用new初始化的时候主要键值对的格式是[key,value]
let _map = new Map([['a',200],['b',300],[foo,400]])
console.log(_map)
//给map添加对象
_map.set(bar,500)
_map.set(baz,600)
console.log(_map)
//实例方法:get,或者所期待的返回值
console.log(_map.get(baz))
_map.delete(foo)
console.log(_map)
//获取map对象的长度
console.log(_map.size)
//返回一个[Map Iterator]对象
console.log(_map.keys())

如果给键值使用引用类型,要注意使用用一个对象

1652352986(1).png

2.WeakMap

  • 只能接受对象作为参数
  • WeakMap其他特性WeakSet类似,没有size属性,没有clear方法,不可遍历

三、Symbol

Symbol的实例是唯一的,是用来保证对象的属性不可重复。

//使用方法
let _only = Symbol("This is unique word")

特性:

  1. 唯一性:用同一个变量生成的值生成的标识不相等
let _only = Symbol("This is unique word")
let _only2 = Symbol("This is unique word")
console.log(_only == _only2) //false

2.用symbol定义的对象的的属性,无法被遍历到

let id = Symbol('id')
let obj = {
  [id]:"this is id",
  "text" : "hello world"
}
for(let value in obj){
  console.log(value)
}
//text

3.想要访问需要使用Object.getOwnPropertySymbols方法 4.全局登录注册:Symbol.for
保证注册的的唯一性

let name1 = Symbol.for('name'); //检测到未创建后新建 
let name2 = Symbol.for('name'); //检测到已创建后返回
console.log(name1 === name2); // true

5.获取字段值:Symbol.keyFor

let _only = Symbol("This is unique word")
console.log(Symbol.keyFor(_only))