数据类型
总结几种 数据类型
一、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属性,它的值时根据被引用来决定的。WeakSet持弱引用:集合中对象的引用为弱引用。 如果没有其他的对WeakSet中对象的引用,那么这些对象会被当成垃圾回收掉。- 如果一个
weakset中的一个对象都不再被引用,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑它还存在于weakSet中。
WeakSet适合临时存放一组对象和对象的相关信息 要理解这句话,看一下下面的例子
let bar = {name:'bar'}
let _set = new Set()
_set.add(bar)
bar = null
console.log(_set)
当一个对象被设置为
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
为了让垃圾回收程序回收元素的内存,可以在这里使用 WeakSet:
const 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())
如果给键值使用引用类型,要注意使用用一个对象
2.WeakMap
- 只能接受对象作为参数
WeakMap其他特性WeakSet类似,没有size属性,没有clear方法,不可遍历
三、Symbol
Symbol的实例是唯一的,是用来保证对象的属性不可重复。
//使用方法
let _only = Symbol("This is unique word")
特性:
- 唯一性:用同一个变量生成的值生成的标识
不相等
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))