1.箭頭函數(shù)適用場景及需要注意的地方:
1.箭頭函數(shù)適合于無復(fù)雜邏輯或者無副作用的純函數(shù)場景下,例如:用在 map、reduce、filter 的回調(diào)函數(shù)定義中
2.箭頭函數(shù)的亮點(diǎn)是簡潔,但在有多層函數(shù)嵌套的情況下,箭頭函數(shù)反而影響了函數(shù)的作用范圍的識別度,這種情況不建議使用箭頭函數(shù)
3.箭頭函數(shù)要實現(xiàn)類似純函數(shù)的效果,必須剔除外部狀態(tài)。所以箭頭函數(shù)不具備普通函數(shù)里常見的 this、arguments 等,當(dāng)然也就不能用 call()、apply()、bind() 去改變 this 的指向
4.箭頭函數(shù)不適合定義對象的方法(對象字面量方法、對象原型方法、構(gòu)造器方法),因為箭頭函數(shù)本身沒有this,其內(nèi)部的 this 指向的是外層作用域的 this
5.箭頭函數(shù)不適合定義結(jié)合動態(tài)上下文的回調(diào)函數(shù)(事件綁定函數(shù)),因為箭頭函數(shù)在聲明的時候會綁定靜態(tài)上下文
button.addEventListener('click', () => {
this.textContent = 'Loading...';
});
// this 并不是指向預(yù)期的 button 元素,而是 window
2.let和const的異同點(diǎn)
1、let和const的相同點(diǎn):
① 只在聲明所在的塊級作用域內(nèi)有效。
② 不提升,同時存在暫時性死區(qū),只能在聲明的位置后面使用。
③ 不可重復(fù)聲明。
2、let和const的不同點(diǎn):
① let聲明的變量可以改變,值和類型都可以改變;const聲明的常量不可以改變,這意味著,const一旦聲明,就必須立即初始化,不能以后再賦值
② 數(shù)組和對象等復(fù)合類型的變量,變量名不指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址。const只保證變量名指向的地址不變,并不保證該地址的數(shù)據(jù)不變,所以將一個復(fù)合類型的變量聲明為常量必須非常小心。
3.Set和Map數(shù)據(jù)結(jié)構(gòu)以及常用方法
set數(shù)據(jù)結(jié)構(gòu)類似于數(shù)組,成員都是唯一的,沒有重復(fù)的值;
Set 結(jié)構(gòu)的實例有以下屬性。
Set.prototype.constructor:構(gòu)造函數(shù),默認(rèn)就是Set函數(shù)。
Set.prototype.size:返回Set實例的成員總數(shù)。
Set 實例的方法分為兩大類:操作方法(用于操作數(shù)據(jù))和遍歷方法(用于遍歷成員)。
&&&下面先介紹四個操作方法。
add(value):添加某個值,返回 Set 結(jié)構(gòu)本身。
delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
has(value):返回一個布爾值,表示該值是否為Set的成員。
clear():清除所有成員,沒有返回值。
&&&Set 結(jié)構(gòu)的實例有四個遍歷方法,可以用于遍歷成員。
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對的遍歷器
forEach():使用回調(diào)函數(shù)遍歷每個成員
需要特別指出的是,Set的遍歷順序就是插入順序。這個特性有時非常有用,比如使用 Set 保存一個回調(diào)函數(shù)列表,調(diào)用時就能保證按照添加順序調(diào)用。
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
遍歷的應(yīng)用:擴(kuò)展運(yùn)算符(...)內(nèi)部使用for...of循環(huán),所以也可以用于 Set 結(jié)構(gòu)。
let unique = [...new Set(arr)];
// [3, 5, 2]
ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當(dāng)作鍵。
(1)size 屬性:size屬性返回 Map 結(jié)構(gòu)的成員總數(shù)。
(2)set(key, value):set方法設(shè)置鍵名key對應(yīng)的鍵值為value,然后返回整個 Map 結(jié)構(gòu)。如果key已經(jīng)有值,則鍵值會被更新,否則就新生成該鍵。
(3)get(key):get方法讀取key對應(yīng)的鍵值,如果找不到key,返回undefined。
(4)has(key)
(5)delete(key)
(6)clear()
遍歷方法
Map 結(jié)構(gòu)原生提供三個遍歷器生成函數(shù)和一個遍歷方法。
keys():返回鍵名的遍歷器。
values():返回鍵值的遍歷器。
entries():返回所有成員的遍歷器。
forEach():遍歷 Map 的所有成員。
const items = [
['name', '張三'],
['title', 'Author']
];
const map = new Map();
items.forEach(
([key, value]) => map.set(key, value)
);
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value); }
// "F" "no"
// "T" "yes"
// 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
Map 結(jié)構(gòu)轉(zhuǎn)為數(shù)組結(jié)構(gòu),比較快速的方法是使用擴(kuò)展運(yùn)算符(...)。
const map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
[...map.keys()]
// [1, 2, 3]
[...map.values()]
// ['one', 'two', 'three']
[...map.entries()]
// [[1,'one'], [2, 'two'], [3, 'three']]
[...map]
// [[1,'one'], [2, 'two'], [3, 'three']]