10.1maps
ES6引入了两个非常受欢迎的数据结构:maps和sets。
Map对象它可以将键和值映射起来。
const u1 = {
name: 'Cynthia'
};
const u2 = {
name: 'Cynthia'
};
const u3 = {
name: 'Cynthia'
};
const u4 = {
name: 'Cynthia'
};
//创建map
const userRoles = new Map();
userRoles.set(u1, 'User');
userRoles.set(u2, 'User');
userRoles.set(u3, 'Admin');
//链式调用
userRoles.set(u1, 'User')
.set(u2, 'User')
.set(u3, 'Admin');
//map 取值
let roleName = userRoles.get(u2);
console.log(roleName);
//has()方法来查看map中是否包含给定的key。
userRoles.has(u1);//true
//如果调用的key在map中不存在,就会返回一个undefined。
userRoles.get(u4);//undefined
//如果key已经在map中了,那么调用set()后key对应的value就会被替换:
userRoles.set(u1,'Admin');
userRoles.get(u1);
//size属性返回map中的元素个数
let size = userRoles.size
console.log(size);
// 使用keys() 方法可以拿到map中所有的键
// 使用values ()可以拿到所有的值,
// 使用entries ()则可以以数组的方式获取键值对,
for(let u of userRoles.keys()){
console.log(u.name);
}
for(let f of userRoles.values()){
console.log(r);
}
for(let [u,r] of userRoles){
console.log('${u.name}:${r}');
}
//使用delete()方法可以删除map中的一个条目
userRoles.delete(u2);
console.log(userRoles.size);
//如果想删除map中的所有条目,可以调用clear()方法
userRoles.clear();
console.log(userRoles.size);
10.2 Weak maps
WeakMap 跟Map在本质上是相同的,除了以下几点
1.key必须是对象。
2.WeakMap中的key可以被垃圾回收。
3.WeakMap不能迭代或者清空。
const SecretHolder = (function() {
const secrets = new WeakMap();
return class {
setSecret(secret) {
secrets.set(this, secret);
}
getSecret() {
return secrets.get(this);
}
}
})();
const a = new SecretHolder();
const b = new SecretHolder();
a.setSecret('secret A');
b.setSecret('secret B');
console.log(a.getSecret());
console.log(b.getSecret());
10.3 sets
set是一个不允许重复数据的集合。
//创建一个Set实例
const roles = new Set();
roles.add("User");
//add 添加元素
roles.add("Admin");
//size 集合大小
console.log(roles.size);
//删除元素
roles.delete("admin");
console.log(roles.size);
console.log(roles.delete("admin"));
10.4 Weak sets
const naughty = new WeakSet();
const children = [{
name: "Suzy"
}, {
name: "Derek"
}];
naughty.add(children[1]);
for (let child of children) {
if (naughty.has(child)) {
console.log(`Coal for ${child.name}!`);
} else {
console.log(`Presents for ${child.name}!`);
}
}