ES6新添加的两个数据结构Set和Map十分相似。
Set
Set本身就是一个构造函数,可以传入一个数组作为参数来构建一个Set的数据结构
var set = new Set([1,2,3,4,5,5,5,"5",{},{}])
//向Set加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。Set内部判断两个值是否不同,使用的算法叫做“Same-value equality”,它类似于精确相等运算符(===)
//由于两个空对象不相等,所以它们被视为两个值。
console.log(set)
console.log(set.size)//6
Set数据结构内部不允许存在两个相同的值,这里的相同指的是严格模式下的相同,也就是“===”。
是有Set构造函数创建的Set数据结构拥有两个属性,除了一个construcut指向Set构造函数外,另外一个就是size属性。
这个Szie属性和数组的length类似。如上面的代码所示。
另外Set拥有的方法有:
add(value)
:添加某个值,返回Set结构本身。//(相当于数组的push)delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。//(相当于数组的splice(index,1))has(value)
:返回一个布尔值,表示该值是否为Set
的成员。//(ES6中数组扩增了一个方法:includes(),返回的是一个布尔值,所以忘掉indexof()吧;clear()
:清除所有成员,没有返回值。所以从上面的来看,Set和数组真的是非常像了(除了不能有相同的值存在之外)。
借用Set的不能存在相同的值的这个特性,用来给数组去重也是非常的方便。
var num = [1,2,3,4,5,5,5,5,2,2]
num =[...new Set(num)]
console.log(num)
keys()
:返回键名的遍历器values()
:返回键值的遍历器(因为Set数据结构是没有键名(或者说键名键值一样)的,所以keys()和values()随便用吧,效果一样;)entries()
:返回键值对的遍历器forEach()
:使用回调函数遍历每个成员需要注意的是entries()
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
Map
Map和Obeject相比,更适合键值对的数据结构模式。因为Map可以使用对象作为键名,虽然Obeject也可以将对象作为键名,但是容易被其他的同类的实例所引用。(ES6文档有Demo)
而在Map中使用对象作为键值对的键,就不会出现这种情况。
var obj ={name:'Dell',gender:'Man'}
var _obj={name:'Dell',gender:'Man'}
var map = new Map();
map.set(obj,1);
console.log(map);
console.log(map._obj);//undefined
因为两个的对象的指向不相同。
Map的属性有:size(和Set一样)。
方法有set(key,value)set
方法返回的是Map本身,因此可以采用链式写法。
get(key)get
方法读取key
对应的键值,如果找不到key
,返回undefined
。
has(key)has
方法返回一个布尔值,表示某个键是否在Map数据结构中。
delete(key)delete
方法删除某个键,返回true。如果删除失败,返回false。
clear()clear
方法清除所有成员,没有返回值
Map原生提供三个遍历器生成函数和一个遍历方法。
keys()
:返回键名的遍历器。values()
:返回键值的遍历器。entries()
:返回所有成员的遍历器。forEach()
:遍历Map的所有成员。使用扩展运算符,可以将Map类型的数据转换为一个二维数组