1.說(shuō)出至少5個(gè)ES6的新特性,并簡(jiǎn)述它們的作用。(簡(jiǎn)答題)
答:
?????1、let關(guān)鍵字,用于聲明只在塊級(jí)作用域起作用的變量。
?????2、const關(guān)鍵字,用于聲明一個(gè)常量。
?????3、解構(gòu)賦值,一種新的變量賦值方式。常用于交換變量值,提取函數(shù)返回值,設(shè)置默認(rèn)值。
?????4、Symbol數(shù)據(jù)類型,定義一個(gè)獨(dú)一無(wú)二的值。
?????5、Proxy代理,用于編寫(xiě)處理函數(shù),來(lái)攔截目標(biāo)對(duì)象的操作。
?????6、for...of遍歷,可遍歷具有iterator 接口的數(shù)據(jù)結(jié)構(gòu)。
?????7、Set結(jié)構(gòu),存儲(chǔ)不重復(fù)的成員值的集合。
?????8、Map結(jié)構(gòu),鍵名可以是任何類型的鍵值對(duì)集合。
?????9、Promise對(duì)象,更合理、規(guī)范地處理異步操作。
?????10、Class類定義類和更簡(jiǎn)便地實(shí)現(xiàn)類的繼承。
?????...
2.使用解構(gòu)賦值,實(shí)現(xiàn)兩個(gè)變量的值的交換(編程題)。
答:
let a = 1;
let b = 2;
[a,b] = [b,a];
3.使用解構(gòu)賦值,完成函數(shù)的參數(shù)默認(rèn)值(編程題)。
function demo({name="王德發(fā)"}){
console.log(name);
}
4.利用數(shù)組推導(dǎo),計(jì)算出數(shù)組 [1,2,3,4] 每一個(gè)元素的平方并組成新的數(shù)組。(編程題)
var arr1 = [1, 2, 3, 4];
var arr2 = [for (i of arr1) i * i];
console.log(arr2);
5.使用模板字符串改寫(xiě)下面的代碼。(ES5 to ES6改寫(xiě)題)
let iam = "我是";
let name = "王德發(fā)";
let str = "大家好,"+iam+name+",多指教。";
改:
let iam = `我是`;
let name = `王德發(fā)`;
let str = `大家好,${iam+name},多指教。`;
6.用對(duì)象的簡(jiǎn)潔表示法改寫(xiě)下面的代碼。(ES5 to ES6改寫(xiě)題)
let name = "王德發(fā)";
let obj = {
"name":name,
"say":function(){
alert('hello world');
}
};
改:
let name = "王德發(fā)";
let obj = {
name,
say(){
alert('hello world');
}
};
7.用箭頭函數(shù)的形式改寫(xiě)下面的代碼。(ES5 to ES6改寫(xiě)題)
arr.forEach(function (v,i) {
console.log(i);
console.log(v);
});
改:
arr.forEach((v,i) => {
console.log(i);
console.log(v);
});
8.設(shè)計(jì)一個(gè)對(duì)象,鍵名的類型至少包含一個(gè)symbol類型,并且實(shí)現(xiàn)遍歷所有key。(編程題)
答:
let name = Symbol('name');
let product = {
[name]:"洗衣機(jī)",
"price":799
};
Reflect.ownKeys(product);
9.有一本書(shū)的屬性為:{“name”:“《ES6基礎(chǔ)系列》”, ”price”:56 };要求使用Proxy對(duì)象對(duì)其進(jìn)行攔截處理,name屬性對(duì)外為“《ES6入門到懵逼》”,price屬性為只讀。(練習(xí)題)
答:
let book = {"name":"《ES6基礎(chǔ)系列》","price":56 };
let proxy = new Proxy(book,{
get:function(target,property){
if(property === "name"){
return "《入門到懵逼》";
}else{
return target[property];
}
},
set:function(target,property,value){
if(property === 'price'){
target[property] = 56;
}
}
});
10.閱讀下面的代碼,并用for...of改成它。(ES5 to ES6改寫(xiě)題)
let arr = [11,22,33,44,55];
let sum = 0;
for(let i=0;i<arr.length;i++){
sum += arr[i];
}
改:
let arr = [11,22,33,44,55];
let sum = 0;
for(value of arr){
sum += value;
}
11.關(guān)于Set結(jié)構(gòu),閱讀下面的代碼,回答問(wèn)題。(代碼閱讀題)。
let s = new Set();
s.add([1]);
s.add([1]);
console.log(s.size);
問(wèn):打印出來(lái)的size的值是多少?
答:2。如果回答為1的,多必是記得Set結(jié)構(gòu)是不會(huì)存儲(chǔ)相同的值。其實(shí)在這個(gè)案例中,兩個(gè)數(shù)組[1]并不是同一個(gè)值,它們分別定義的數(shù)組,在內(nèi)存中分別對(duì)應(yīng)著不同的存儲(chǔ)地址,因此并不是相同的值。所以都能存儲(chǔ)到Set結(jié)構(gòu)中,size為2。
12.關(guān)于Map結(jié)構(gòu),閱讀下面的代碼,回答問(wèn)題。(代碼閱讀題)
let map = new Map();
map.set([1],"ES6系列");
let con = map.get([1]);
console.log(con);
問(wèn):打印出來(lái)的變量con的值是多少,為什么?
答:undefined。因?yàn)閟et的時(shí)候用的數(shù)組[1]和get的時(shí)候用的數(shù)組[1]是分別兩個(gè)不同的數(shù)組,只不過(guò)它們?cè)囟际?。它們是分別定義的兩個(gè)數(shù)組,并不是同一個(gè)值。新手避免在這里犯錯(cuò)。如果想達(dá)到預(yù)期的效果,你要保證get的時(shí)候和set的時(shí)候用同一個(gè)數(shù)組。比如:
let map = new Map();
let arr = [1];
map.set(arr,"ES6系列");
let con = map.get(arr);
console.log(con); //ES6系列
13.定義一個(gè)類Animal,通過(guò)傳參初始化它的類型,如:“貓科類”。它有一個(gè)實(shí)例方法:run,run函數(shù)體內(nèi)容可自行定義。
答案:
class Animal {
constructor(type){
this.type = type;
}
run(){
alert('I can run');
}
}
14.基于第12題的Animal類,定義一個(gè)子類Cat并繼承Animal類。初始化Cat類的昵稱name和年齡age。并擁有實(shí)例方法eat,eat函數(shù)體內(nèi)容可自行定義。
答:
class Cat extends Animal{
constructor(type,name,age){
super(type);
this.name = name;
this.age = age;
}
eat(){
alert('I am eating');
}
}
15.利用module模塊,實(shí)現(xiàn)兩個(gè)模塊A和B,A模塊導(dǎo)出變量name,age和say方法。B模塊只導(dǎo)入變量name和say方法,并且重命名name為nickname。
//-----模塊A-------//
var name = "kitty";
var age = 15;
var say = function(){
//....