es6学习笔记--新数据结构Set,Map以及WeakSet,WeakMap
在javascript中,存储数据的方式大部分就是以数组或者对象形式存储的,es6出现了4种新集合Set,Map,WeakSet,WeakMap来存储数据,简化了编程。
集合–Set
let arr = new Set([1,2,3,4,4,4]) console.log(arr) // Set(4) {1, 2, 3, 4} console.log(Object.prototype.toString.call( arr)) // [object Set] let obj = new Set({name:'peter'}) console.log(obj) // Uncaught TypeError: undefined is not a function let str = new Set('abc') console.log(str) // Set(3) {"a", "b", "c"}
可以利用Set的特性,可以对数组进行去重。
let arr = new Set([1,2,3,4,5,4,4,4,4]) console.log([...arr]) // [1, 2, 3, 4, 5] console.log(Array.from(arr)) // [1, 2, 3, 4, 5]
console.log(new Set([1,2,3,4,'4','3'])) // [1, 2, 3, 4, '4', '3'] let set = new Set(); set.add(NaN); set.add(NaN); console.log(set) // Set {NaN}
Set属性 — size
let set = new Set([1,2,3,4]) console.log(set.size) // 4
Set实例的方法
let a = new Set() a.add(2) console.log(a) // Set(1) {2} a.add(3) a.add(2) console.log(a.add(2)) // Set(2) {2, 3} console.log(a) // Set(2) {2, 3}
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
let a = new Set([1,2,3]) console.log(a.delete(2)) // true console.log(a.delete(5)) // false console.log(a) // {1, 3}
has(value):返回一个布尔值,表示该值是否为Set的成员。
let a = new Set([1,2,3]) console.log(a.has(1)) // true console.log(a.has(4)) // false
clear():清除所有成员,没有返回值。
let a = new Set([1,2,3,4]) console.log(a.clear()) // undefined a.clear() console.log(a) // Set(0) {}
关于遍历操作,对象的遍历操作也适用于Set,
let set = new Set(['a', 'b', 'c']) for( let i of set.keys()) { console.log(i) // a b c } for( let i of set.entries()) { console.log(i) // ["a", "a"] ["b", "b"] ["c", "c"] }
集合–WeakSet
和set一样,是个构造函数,用new来创建。和Set不同的是:因为不可遍历,所以没有size属性
const ws = new WeakSet(); console.log(ws) // WeakSet {} let ws = new WeakSet([[1,2,3,4],[5,6]]) console.log(ws) // WeakSet {Array(2), Array(4)}
WeakSet方法:
let ws = new WeakSet(); ws.add({}) console.log(ws) // WeakSet {{…}}
let ws = new WeakSet(); let obj = {} ws.add(obj) ws.delete(obj) console.log(ws) // WeakSet {}
let ws = new WeakSet(); let obj = {} let obj1 = {} ws.add(obj) console.log(ws.has(obj)) // true console.log(ws.has(obj1)) // false
集合–Map
let map = new Map() console.log(map) // Map(0) {}
const map = new Map([ ['name', 'peter'], ['age', '25'] ]); console.log(map) // Map(2) {"name" => "peter", "age" => "25"}
Map属性:
size 能够返回Map成员的数量
const map = new Map([ ['name', 'peter'], ['age', '25'] ]); console.log(map.size) // 2
Map方法
set(key, value) 设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
let map = new Map(); map.set('name','peter').set('age', 25).set({color:'red'},'key') console.log(map) // Map(3) {"name" => "peter", "age" => 25, {…} => "key"}
let map = new Map(); map.set('name','peter').set('name', 25).set('name','key') console.log(map) // Map(1) {"name" => "key"}
let map = new Map(); map.set({name:'peter'}, 1).set({name:'Peter'}, 2) console.log(map) //Map(2) {{…} => 1, {…} => 2}
get(key) 读取key对应的键值,如果找不到key,返回undefined。
let map = new Map() map.set('name','peter') console.log(map.get('name')) // peter console.log(map.get('age')) // undefined
has(key) 返回一个布尔值,表示某个键是否在当前 Map 对象之中
let map = new Map() map.set('name','peter') console.log(map.has('name')) // peter console.log(map.has('age')) // false
delete(key) 删除某个键,返回true。如果删除失败,返回false
let map = new Map() map.set('name','peter') console.log(map) // Map(1) {"name" => "peter"} console.log(map.delete('name')) // peter console.log(map.delete('age')) // false console.log(map) // Map(0) {}
clear() 清除所有成员,没有返回值。
let map = new Map() map.set('name','peter') console.log(map) // Map(1) {"name" => "peter"} console.log(map.clear()) console.log(map) // Map(0) {}
关于遍历操作,对象的遍历操作也适用于Map
集合–WeakMap
方法:
let key1 = {}, key2 = {}, map = new WeakMap([[key1, "Hello"], [key2, 42]]); console.log(map.has(key1)); // true console.log(map.get(key1)); // "Hello" console.log(map.has(key2)); // true console.log(map.get(key2)); // 42 console.log(map.delete(key2)) // true console.log(map) // WeakMap {{…} => "Hello"}