通過這個系列的學習,相信大家對ES6已結有一定程度的了解。

所以本節的目的在於通過測試,便於讓大家了解在學習中的知識掌握情況,查缺補漏,一步一個腳印。

1、選擇題

1.1 下面不屬於關鍵字let的特點的是:( )

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

B、會產生變數提升現象

C、同一個作用域,不能重複聲明同一個變數

D、不能在函數內部重新聲明參數

答案:B

解析:使用var關鍵字才會產生變數提升的現象。關鍵字let不會產生變數提升現象,所以必須先聲明定義後使用,否則程序拋出異常。

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、簡答題

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

答:? 1、let關鍵字,用於聲明只在塊級作用域起作用的變數。? 2、const關鍵字,用於聲明一個常量。? 3、解構賦值,一種新的變數賦值方式。常用於交換變數值,提取函數返回值,設置默認值。? 4、Symbol數據類型,定義一個獨一無二的值。? 5、Proxy代理,用於編寫處理函數,來攔截目標對象的操作。? 6、for...of遍歷,可遍歷具有iterator 介面的數據結構。? 7、Set結構,存儲不重複的成員值的集合。? 8、Map結構,鍵名可以是任何類型的鍵值對集合。? 9、Promise對象,更合理、規範地處理非同步操作。? 10、Class類定義類和更簡便地實現類的繼承。

3、編程題

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、運行分析題

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)
})

運行結果
thensuccess1
?
原因
構造函數中的 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

5、總結

相信通過本次測試,大家又加深了對ES6的理解。

對沒有完全掌握的部分,接下來可以進行有針對性的訓練,那麼你將在距離成為大神的道路上,又更近一步啦。


推薦閱讀:
相关文章