一、Set 和 Map 数据结构
Set
ES6提供了新的数据结构Set,它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
本身是一个构造函数(使用时要实例化new一下),用来生成Set数据结构
const s=new Set();
[2,3,5,4,5,2,2].forEach(x => s.add(x));
for(let i of s ){
console.log(i);//2,3,5,4
}
上面代码通过add()方法向Set结构加入成员,结果表明Set结构不会添加重复的值。
Set结构的实例有以下属性:
1、Set.prototype.constructor
Set的构造函数constructor指向自己本身
console.log(Set.prototype.constructor);//构造函数Set()
2、Set.prototype.size
返回Set实例的成员总数(相当于Array.length)
Set实例的方法 分成两大类:操作方法(用于操作数据)和遍历方法(遍历成员)下面是四个操作方法:
Set 操作方法
1、Set.prototype.add(value)
添加某个值,返回Set结构本身
2、Set.prototype.delete(value)
删除某个值,返回一个布尔值,表示删除是否成功
3、Set.prototype.has(value)
返回一个布尔值,表示该值是否是Set成员
4、Set.prototype.clear()
清除所有成员,没有返回值
数组去重的简便写法(Set)
let arr=[1,2,3,2,4,5,4,4,6];
let set1=new Set(arr);
console.log(set1);//[1,2,3,4,5,6]
遍历Set 对象
for…of…遍历
for(let val of set1){
console.log(val);//1 2 3 4 5 6
}
将Set集合转换为真正的数组Array.from()
console.log(Array.from(set1));//[1,2,3,4,5,6]
将Set集合转为数组 : 解构赋值
let [...array]=[...Set1];
console.log(array);
Set结构 的实例的遍历方法:
1、Set.prototype.keys()
返回键名的遍历器
2、Set.prototype.values()
返回键值的遍历器
3、Set.prototype.entries()
返回键值对的遍历器
4、Set.prototype.forEach()
使用回调函数遍历每个成员
Set的遍历顺序
就是插入顺序
,比如使用一个Set保存一个回调函数列表,调用时就能保证按照添加顺序调用
由于Set结构没有键名(或者说键名和键值是同一个值),所以keys
方法和values
方法的行为完全一致
二、WeakSet
WeakSet结构和Set类似,也是不重复的值的集合,但是,它与Set有两个区别,WeakSet的成员只能是对象(对象会不定时消失),而不能是其他类型的值,但是对象里的值无法遍历。
三、Map
也是构造函数(new) 存储的是键值对
Map() 构造函数不传参
Map的构造实例的方法:
Set
设置Map结构中的值
let map=new Map();
map.set("array",[1,2,3]);
map.set("object",{name:"zhangsan",age:20});
console.log(map);
get
获取Map结构中的值
console.log(map.get("array"));
size
返回Map的长度
has
检测键是否存在 返回布尔值
delete
删除键 返回布尔值
clear
全部清除 返回布尔值
Map.keys() 返回键名的遍历器
Map.values() 返回键值的遍历器
Map.entries() 返回键值对的遍历器
Map.forEach() 遍历
四、Promise(异步编程)
promise对象是一个构造函数,用来生成Promise实例
const promise=new Promise(function(resolve,reject){
if(//异步操作成功){
resolve(value);
}else{
reject(error);
}
});
Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject,他们是两个函数 resolve
函数的作用是,将promise对象的状态从“未完成”
变为“成功”
在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
reject
函数的作用是,将promise对象的状态从"未完成"
变为"失败"
,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
Promise
实例生成以后,可以用then
方法分别指定resolve
状态和reject
状态的回调函数
promise.then(function(value){
//success
},function(error){
//error
});
then
方法可以接收两个回调函数作为参数,第一个回调函数是promise对象的状态变为resolve时调用,第二个回调函数是promise对象的状态变为reject时调用,这两个函数都接受promise对象传出的值作为参数
模拟异步编程:
let sendajax=function(ms){
return new Promise(function(resolve,reject){
try{
setTimeout(resolve,ms,"参数");
}
catch(e){
reject(e);
}
finally{
console.log("处理完成");
}
});
}
sendajax(1000).then(function(result){
console.log(result);//参数
},function(error){
console.log(error);
});
}
还可以把then方法里的参数分开写:
let promise2=new Promise(function(resolve,reject){
if(true){
resolve("成功");
}
else{
reject("失败");
}
};
promise2.then(function(res){
//success
console.log(res); //成功
}).catch(function(err){
console.log(err);
});
}
Promise.prototype.then()
Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上
,作用是为promise实例添加状态改变时的回调函数。
then方法返回的是一个新的Promise实例(不再是原来的promise实例),因此可以采用链式写法
,then方法后面 再调用另一个then方法
Promise.prototype.catch() 抓异常状态
Promise.prototype.finally() 该方法不管什么状态都会执行
Promise.all() 将多个promise对象整合成一个promise对象 参数是数组
Promise.resolve() 将现有的对象转换为promise对象