Es6(剩余参数---扩展运算符): …代替了es5的arguments
一、剩余运算符(…) 用法例: 把多个独立的字段合并到一个数组中
//obj 接收的是 book参数, …keys接收的是其余参数
function pick(obj, …keys){
}
let book = {
title: 'es6教程',
author: '张三',
year: 2022
}
let bookData = pick(book, 'title', 'year');
二、扩展运算符(…) 用例: 将一个数组分割,并将各个项作为分离的参数传给函数
const arr = [10,20,30,40,50,70,60];
console.log(Math.max(…arr)); //找到数组中最大的值
三、箭头函数注意事项
1、使用箭头函数,函数内部没有 orguments
2、箭头函数不能是要 new关键字来实例化对象(function函数是一个对象,但是箭头函数不是一个对象,它是一个函数的语法糖---表达式)
四、结构赋值: 结构赋值是对赋值运算符的一种扩展,主要针对 数组和对象 来进行操作
对象的拓展方法:
is() 等价于 === :比较两个值是否严格相等(值与数据类型)
用法:
console.log( Object.is(NaN,NaN) )
assign() :对象的合并
用法:
let obj = {c: 11,d: 12,e: 13};
Object.assign(obj,{a:1,b:2})
五、symbol类型: 原始数据类型 Symbol,他表示是独一无二的值(内存地址不一样)
通过Symbol定义值,表示变量是独一无二的
最大用途:用来定义对象的私有变量
const name1 = Symbol('name');
const name2 = Symbol('name');
console.log(name1 === name2) //false
let s1 = Symbol('s1');
let obj={
[s1]: '谢小胖'
};
//如果用Symbol 定义的对象中的变量,取值时一定要用 [变量名]
console.log(obj[s1]);
如何获取Symbol声明的属性名(对象的key)
1、Object.getOwnPropertySymbols(obj)
2、Reflect.ownKeys(obj)
六、Map 和 Set
Set:(集合,表示无重复值的有序列表)
let set1 = new Set();
set1.add(2); //添加元素
set1.add(3);
set1.delete(2); //删除元素
set1.has(3); //校验某个值是否在set1中
set1.size(); //校验set1的长度
// 循环 --- 一般不用forEach
set1.forEach((val,key)=>{
console.log(val);
console.log(key)
})
//将set转为数组操作
let set2 = new set([1,2,3,4,5,6]);
let arr = [ …set2];
Map:是键值对的有序列表,键和值可以是任意类型
let map1 = new Map();
map1.set('name': '张三'); //添加参数
map1.get('name') //取map1中name的值
map1.has('name') //校验某个值是否在map1中
map1.delete('name') //删除
map1.clear() //清空
七、数组的拓展功能
数组的方法: from() 和 of()
from() 将伪数组转换为真正的数组
例子:
function add (){
let lis = Array.from(arguments); //或者使用扩展运算符 let arr = […arguments];
}
add (1,2,3)
from() 还可以接受第二个参数,用来对每个元素进行处理
let liContent = Array.from(lis, ele =>ele.textContent);
of() 将一组值,转为数组
Array.of(3,11,23,[1,2,3],{id: 1,name: '张三'});
copyWithin() 当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组
[1,2,4,10].copyWithin(0,3)
find()---查找元素,返回第一个符合条件的数据; findIndex()----查找索引,返回第一个符合条件的索引
[1,-20,2,4,10,-10].find((n)=>{
return n < 0
})
[1,-20,2,4,10,-10].findIndex( (n) => n < 0)
keys()---对键名的遍历; values()---对值的遍历;entries()---对健值的遍历; 返回一个遍历器,可以使用循环进行遍历
includes() 返回一个布尔
值,表示某个是否包含某个给定的值;indexOf(),返回值为-1则不存在,否则存在
[1,2,3,5].includes(2) //true
[1,2,3,5].includes(6) //false
[1,2,3,5].indexOf(2) //1
[1,2,3,5].indexOf(6) //-1
八、迭代器 Iterator ----- 是一种新的遍历机制,两个核心:
1、迭代器是一个接口,能快捷的访问数据,通过Symbol创建迭代器,通过迭代器的next()方法获取迭代之后的结果;
2、迭代器是用于遍历数据结构的指针(数据库的游标)
const items = ['one' , 'two' , 'three'];
const item = items[Symbol.iterator]();
console.log(item.next());
console.log(item.next());
console.log(item.next());
console.log(item.next());
{value: 'one', done: false}
{value: 'two', done: false}
{value: 'three', done: false}
{value: undefined, done: true}
返回的done如果为false标识遍历可继续,如果为true,则表示遍历结束
九、生成器 generator函数,可以通过yield关键字,将函数挂起,为了改变执行流提供了可能,同时为了做异步编程提供了方案。
与普通函数的区别
1、function后面 函数名之前 有个 *
2、只能在函数内部使用yield表达式,让函数挂起
function* func(){
yield 1;
yield 3;
yield 4;
}
func()
function* func(){
console.log('one');
yield 1;
console.log('two');
yield 3;
console.log('end');
}
let fn = func();
console.log(fn.next());
console.log(fn.next());
console.log(fn.next());
总结: generator函数是分段执行的,yield语句是暂停执行,而next()是恢复执行
function* add(){
console.log('statr');
//x 可真的不是yield '2' 的返回值,他是next()调用 恢复当前yield()执行传入的实参
let x = yield '2';
console.log('one:'+x);
let y = yield '3';
console.log('two:'+y);
return x+y
}
const fn = add();
console.log(fn.next());
console.log(fn.next(20));
console.log(fn.next(30));
使用场景: 为不具备Interator接口的对象提供了遍历操作
十、Generator 生成器的应用 部署ajax操作,让异步代码同步化
回调地狱
a. 用生成器解决 请求完后继续请求,请求完后又继续请求
十一、Promise 对象
相当于一个容器,保存着未来才会结束的事件(异步操作)的一个结果
各种异步操作都可以用同样的方法进行处理
特点:
1、对象的状态不受外界影响,处理异步操作三个状态: pending(进行中),resolved(成功),rejected(失败)
2、一旦状态改变,就不会再变。任何时候都可以得到这个结果
resolved()能将现有的任何对象转换成promise对象
十二、async----await: 使得异步操作更加方便
基本操作 async 它会返回一个promise对象 then catch
async 是 Generator(生成器) 的一个语法糖