symbol
symbol是基本数据类型,每一个symbol值都是一个全局唯一的字符串,你永远不会知道它里面存的什么,symbol值可以作为对象的属性的键。
总结:
- window.Symbol()
- Symbol()前面不能加new
- Symbol() !== Symbol()
- object[Symbol()]='xxx' 可以作为对象的键,创造私有属性
symbol作用:
可以造一个隐藏属性
使用方法:在一个块级作用域里使用symbol
{
let a = Symbol()
let object = {
name: 'ooo',
age: 10,
[a]: '隐藏属性'
}
window.object = object
}
上面的代码我们可以访问到它里面的name和age但是我们不能访问到a,包括我们直接通过object[Symbol]也访问不到它
Set
set类型是Object里面的一种
Set对象里面只要有重复的值他都会只保留一个,无论是原始值还是对象引用。
作用:实现数组去重
- 不使用Set实现数组去重
var a = [1,2,3,1,5,6,2]
function uniq(array){
var result = []
var hash = {}
for(var i =0;i<array.length;i++){
hash[array[i]]=true
}
for(key in hash){
result.push(key)
}
return result
}
uniq(a)
//["1", "2", "3", "5", "6"]
问题:
1.他无法区分数字和字符串
2.如果数组里面有对象我们的去重方法就会失败,因为对象里面的下标(键)只能是字符串
- 使用Set实现数组去重
其中Array.from是将任意类型转化成一个数组
Map
可以允许任何类型作为对象的键,弥补了object只能使用字符串作为键的问题
- 通过for...of进行遍历
.keys()拿到所有的key
for(let key of map.keys()){
console.log(key)
}
.values()拿到所有的value
for(let key of map.values()){
console.log(key)
}
.entries()拿到所有的key和value
for(let key of map.entries()){
console.log(key)
}
weakSet和WeakMap是弱引用,放在它们的key里面的东西会自然消失,它无法知道自己有哪些值