ES6—面試常見ES6問題集錦(14)

經過對ES6系列文章的學習,相信你們對ES6已結有必定程度的瞭解。編程

因此本節的目的在於經過測試,便於讓你們瞭解在學習中的知識掌握狀況,查缺補漏,一步一個腳印。數組

一、選擇題promise

1.1 下面不屬於關鍵字let的特色的是:( )數據結構

A、只在 let 命令所在的代碼塊內有效異步

B、會產生變量提高現象函數

C、同一個做用域,不能重複聲明同一個變量學習

D、不能在函數內部從新聲明參數測試

答案:Bthis

解析:使用var關鍵字纔會產生變量提高的現象。關鍵字let不會產生變量提高現象,因此必須先聲明定義後使用,不然程序拋出異常。prototype

1.2 關於定義常量的關鍵字const,定義一個Object對象{「name」:」Jack」},再對屬性name 的值進行修改,如:obj.name = 「John」。下列說法正確的:()

A、修改常量,程序跑出異常

B、程序不拋出異常,修改無效

C、修改爲功,name的值爲John

D、程序不拋出異常,name的值爲undefined

答案:C

解析:用const來聲明一個對象類型的常量,就是傳址賦值。而不可修改的是對象在內存中的地址,而不是對象自己。因此修改name並非修改對象的內存地址,因此能夠成功修改。

1.3 在對象的解構賦值中,var {a,b,c} = { 「c」:10, 」b」:9, 」a」:8 } 結果中,a、b、c的值分別是:()

A、10 9 8

B、8 9 10

C、undefined 9 undefined

D、null 9 null

答案:B

解析:對象的解構賦值不會受到屬性的排列次序影響。

1.4 關於模板字符串,下列說法不正確的是:()

A、使用反引號標識

B、插入變量的時候使用${ }

C、全部的空格和縮進都會被保留在輸出中

D、${ }中的表達式不能是函數的調用

答案:D

解析:${ }中能夠聽任意的JavaScript表達式,包括運算表達式、對象屬性、函數調用等。

1.5 關於字符串擴展的新函數,下面描述錯誤的是:()

A、includes函數用於判斷字符串中是否含有指定的子字符串

B、repeat函數將目標字符串重複N次,目標字符串被修改

C、startsWidth函數判斷指定的子字符串是否出如今目標字符串頭部位置

D、endWidth函數判斷指定的子字符串是否出如今目標字符串尾部位置

答案:B

解析:repeat函數將目標字符串重複N次,會返回一個新的字符串,不影響目標字符串。

1.6 數組擴展的fill( )函數,[1,2,3].fill(4)的結果是:()

A、[4]

B、[1,2,3,4]

C、[4,1,2,3]

D、[4,4,4]

答案:D

解析:fill函數的參數會把原數組的每一個元素填充成指定的參數。

1.7 數組的擴展中,不屬於用於數組遍歷的函數的是:()

A、keys( )

B、entries( )

C、values( )

D、find( )

答案:D

解析:find函數用於找出數組中符合條件的第一個元素,並非用於遍歷數組。

1.8 關於Proxy代理,下面說法錯誤的是:()

A、能夠理解成在目標對象以前,架設一層「攔截」

B、Proxy的get 方法用於攔截某個屬性的讀取操做。

C、Proxy的set方法用於攔截對對象的寫操做。

D、一旦對象設置Proxy代理後不可取消,因此要謹慎操做

答案:D

解析:能夠用Proxy.revocable( )來取消代理,並非不能夠取消的。

1.9 關於Set結構的實例方法,下面說法錯誤的是:()

A、set方法用於添加成員

B、clear方法用於清除全部成員。

C、entries方法返回成員的位置索引和值的遍歷器

D、values方法返回成員值的便利器

答案:C

解析:返回的是鍵名和鍵值的遍歷器;特別注意的是:set結構的鍵名和鍵值是同一個值。

1.10 下面關於類class的描述,錯誤的是:()

A、 JavaScript的類class本質上是基於原型prototype的實現方式作了進一步的封裝

B、 constructor構造方法是必須的

C、 若是類的constructor構造方法有多個,後者會覆蓋前者

D、 類的靜態方法能夠經過類名調用,不須要實例化

答案:C

解析:同一個類的constructor構造方法只能有一個,不然程序會報錯。

1.11 關於Promise對象的狀態,下列說法錯誤的是:()

A、 三種狀態分別是:pending初始狀態、fulfilled成功、rejected失敗

B、 pending初始狀態能夠狀變成fulfilled成功

C、 rejected失敗不能夠狀變成pending初始狀態

D、 rejected失敗能夠狀變成fulfilled成功

答案:D

解析:A、B、C的說法都是正確的,rejected失敗和fulfilled成功之間不能相互轉換,故D選項是錯誤的。

1.12 關於新特性Generator函數的描述,錯誤的是:()

A、Generator函數,又稱生成器函數

B、聲明Generator函數的關鍵字是:function*

C、Generator函數執行後獲得的一個生成器

D、使用return語句使Generator函數暫停執行,直到next方法的調用

答案:D

解析:使函數暫停執行的關鍵字是yield,不是return;return語句是使函數中止執行並退出。

1.13 Generator函數的yield關鍵字的做用是:()

A、中止執行

B、退出函數

C、暫停執行,等待next( )方法調用

D、中止執行,可自行恢復執行

答案:C

解析:Generator函數能夠有不少個yield。而return表明的是終止執行,yield表明的是暫停執行,後續經過調用生成器的next( )方法,能夠恢復執行。

1.14 module模塊中,對下列語句的描述,錯誤的是:()

A、export 導出

B、import 導入

C、export default 默認導出

D、import * as 重命名

答案:D

解析:import as:星號符實現的是總體導入。而重命名的實現方式是:import { name as myname }。

1.15 在類的繼承中,關於super的說法錯誤的是:()

A、 在子類的構造函數,必須先調用super( )

B、 super至關於子類的引用

C、 先調用super( ),纔可使用this

D、 super( )至關於父類構造函數的調用

答案:B

解析:super是父類的引用,咱們能夠經過super來調用父類的方法和屬性。

二、簡答題

2.1 說出至少5個ES6的新特性,並簡述它們的做用。(簡答題)

答:

一、let關鍵字,用於聲明只在塊級做用域起做用的變量。

 二、const關鍵字,用於聲明一個常量。

 三、解構賦值,一種新的變量賦值方式。經常使用於交換變量值,提取函數返回值,設置默認值。

 四、Symbol數據類型,定義一個獨一無二的值。

 五、Proxy代理,用於編寫處理函數,來攔截目標對象的操做。

 六、for...of遍歷,可遍歷具備iterator 接口的數據結構。

 七、Set結構,存儲不重複的成員值的集合。

 八、Map結構,鍵名能夠是任何類型的鍵值對集合。

 九、Promise對象,更合理、規範地處理異步操做。

 十、Class類定義類和更簡便地實現類的繼承。

三、編程題

3.1 使用解構賦值,實現兩個變量的值的交換

答:

let a = 1;
let b = 2;
[a,b] = [b,a];

3.2 使用模板字符串改寫下面的代碼。(ES5 to ES6改寫題)

let iam  = "我是";
let name = "大彬哥";
let str  = "你們好,"+iam+name+",我想死大家啦。";

改爲模板字符串:

let iam  = `我是`;
let name = `大彬哥`;
let str  = `你們好,${iam+name},我想死大家啦。`;

3.3 promise對象的用法,手寫一個promise

promise是一個構造函數,下面是一個簡單實例

var promise = new Promise((resolve,reject) => {
    if (操做成功) {
        resolve(value)
    } else {
        reject(error)
    }
})
promise.then(function (value) {
    // success
},function (value) {
    // failure
})

3.4 閱讀下面的代碼,並用for...of改爲它。(ES5 to ES6改寫題)

let arr = ['a','b','c','d','e'];
let sum = 'z';
for(let i=0;i<arr.length;i++){
    sum += arr[i];
}

改:

let arr =  ['a','b','c','d','e'];
let sum = 'z';
for(value of arr){
    sum += value;
}

四、運行分析題

4.1 分析下列程序代碼,得出運行結果,解釋其緣由

const promise = new Promise((resolve, reject) => {
  resolve('success1')
  reject('error')
  resolve('success2')
})

promise
  .then((res) => {
    console.log('then: ', res)
  })
  .catch((err) => {
    console.log('catch: ', err)
  })



運行結果:
then:success1

緣由:
構造函數中的 resolve 或 reject 只有第一次執行有效,屢次調用沒有任何做用

4.2 如下代碼依次輸出的內容是?

setTimeout(function () {
  console.log(1)
}, 0);
new Promise(function executor(resolve) {
  console.log(2);
  for (var i = 0; i < 10000; i++) {
    i == 9999 && resolve();
  }
  console.log(3);
}).then(function () {
  console.log(4);
});
console.log(5);

解析:

首先先碰到一個 setTimeout,因而會先設置一個定時,在定時結束後將傳遞這個函數放到任務隊列裏面,所以開始確定不會輸出 1 。 

而後是一個 Promise,裏面的函數是直接執行的,所以應該直接輸出 2 3 。 

而後,Promise 的 then 應當會放到當前 tick 的最後,可是仍是在當前 tick 中。 

所以,應當先輸出 5,而後再輸出 4 , 最後在到下一個 tick,就是 1 。

2 3 5 4 1

五、總結

相信經過本次測試,你們又加深了對ES6的理解。

對沒有徹底掌握的部分,接下來能夠進行有針對性的訓練,那麼你將在距離成爲大神的道路上,又更近一步啦。

相關文章
相關標籤/搜索