Set
Set是和数组类似的数据结构,但是Set中,所有的成员值都是唯一的,也就是,没有重复值。
创建一个Set可以使用new Set()
方法:
const set = new Set();
然后,可以通过add()
方法向set中添加成员。
set.add(1);
如果在add过程中,添加了重复的成员,那么该成员将会被忽略。
另外,也可以直接向Set()中传递一个(类)数组作为参数来初始化一个新的set对象。
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5,可见重复的元素被忽略了
关于重复元素的说明:
1、向set中加入值的时候,不会发生类型转换。这也就意味着,1、“1”将会是两个不同的元素。
2、在JS中,我们知道,NaN是和自身不想等的,但是在set中,加入多个NaN则只会保存一个。(set认为NaN===NaN)
3、var a = {name:"xiaoming"}
和var b = {name:"xiaoming"}
是不相等的两个对象。
Set的属性和方法
1、size:返回set实例的元素数目
2、add():为Set添加元素。返回Set实例本身。这也就意味着,add()方法可以链式调用。
3、delete():删除某个值,返回布尔值表示是否成功删除。
4、has():查询set实例中是否有某个值,返回对应的布尔值。
5、clear():清除所有成员,无返回值。
6、
keys():返回set实例所有键名的遍历器
values():返回set实例所有键值的遍历器
entries():返回set实例所有键值对的遍历器
注:set中 键值 = 键名 = set元素本身
栗子:
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"]
7、forEach():与Array.forEach()方法类似,可以使用回调函数遍历所有成员。
另外,set数据结构有自己原生的[Symbol.iterator],可以用for of方法直接遍历:
let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
console.log(x);
}
// red
// green
// blue
Map
不知道大家在使用ES5的Object对象的时候会不会有这样的不适:当你使用一个Object来作为键的时候,它被自动的转换为”[object Object]”这样的东西。这是因为,Object只能使用字符串来当作键,如果不是字符串,将会被自动转化为String。
Map就是为了解决这个问题而出现的新的数据结构,它允许任何类型的数据结构充当键。
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content" 成功!
初始化方法:
可以使用new Map()
来新建一个Map实例,同时,该方法可以接受一个数组A作为参数,数组A的元素是一个或多个数组——这些数组内仅包含两个元素,作为Map内成员的的键和值。
栗子:
const map = new Map([
['name', 'Emily'],// 键:name ;值:‘Emily’
['age', 18]
]);
map.size // 2
map.has('name') // true
map.get('name') // "Emily"
map.has('age') // true
map.get('age') // 18
Map规则:
如果对同一个键多次赋值,那么,后面的值将会覆盖前面的。
如果读取一个没有赋值的键,将返回undefined。
注意:
const map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined
map.set({a:"a"}, 555);
map.get({a:"a"}) // undefined
这是因为,[‘a’]和[‘a’],{a:”a”}和{a:”a”}虽然表面看上去一样,但他们的内存地址是不同的,它们被视为两个不同的值。(同set的判断元素是否重复的规则很像)
* Map的属性和方法 *
1、属性size:返回map结构的成员(键值对)总数
2、map.set(key,value):为map添加键值对。如果该键为新键则添加,否则就覆盖原有的值。
3、map.get(key):获取对应的值,如果找不到key,就返回undefined。
4、map.has(key):判断这个键是否存在,返回true或false。
5、map.delete(key):删除以key为键的键值对,成功返回true,否则返回false。
6、map.clear():清除所有成员。
7、
keys():返回Map实例所有键名的遍历器。
values():返回Map实例所有键值的遍历器。
entries():返回Map实例所有键值对的遍历器。
forEach():遍历Map实例所有成员。
(遍历顺序即插入顺序)
总结一下就是,
Set:值不重复的数组。
Map:可以采用任何数据结构作为键值的Object。