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(生成器) 的一個語法糖