ES6語法和新特性--面試題

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']]

4.類的理解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容