ES6進階之路
1.說出至少5個ES6的新特性,並簡述它們的作用。
1、 let關鍵字,用於聲明只在塊級作用域起作用的變量。 2、 const關鍵字,用於聲明一個常量。 3、 結構賦值,一種新的變量賦值方式。常用於交換變量值,提取函數返回值,設置默認值。 4、 Symbol數據類型,定義一個獨一無二的值。 5、 Proxy代理,用於編寫處理函數,來攔截目標對象的操作。 6、 for...of遍歷,可遍歷具有iterator 接口的數據結構。 7、 Set結構,存儲不重復的成員值的集合。 8、 Map結構,鍵名可以是任何類型的鍵值對集合。 9、 Promise對象,更合理、規範地處理異步操作。 10、Class類定義類和更簡便地實現類的繼承。
2.使用結構賦值,實現兩個變量的值的交換
答案: let a = 1; let b = 2; [a,b] = [b,a];
3.使用結構賦值,完成函數的參數默認值
function demo({name="前端君"}){ console.log(name); }
4.利用數組推導,計算出數組 [1,2,3,4] 每一個元素的平方並組成新的數組
var arr1 = [1, 2, 3, 4]; var arr2 = [for (i of arr1) i * i]; console.log(arr2);
5.使用模板字符串改寫下面的代碼
let iam = "我是"; let name= "前端君"; let str = "大家好,"+iam+name+",多指教。"; 改寫成: let iam = `我是`; let name = `前端君`; let str = `大家好,${iam+name},多指教。`;
6.用對象的簡潔表示法改寫下面的代碼
let name = "前端君"; let obj = { "name":name, "say":function(){ alert(‘hello world‘); } }; 改寫成: let name = "前端君"; let obj = { name, say(){ alert(‘hello world‘); } };
7.用箭頭函數的形式改寫下面的代碼。
arr.forEach(function (v,i) { console.log(i); console.log(v); }); 改寫成: arr.forEach((v,i) => { console.log(i); console.log(v); });
8.設計一個對象,鍵名的類型至少包含一個symbol類型,並且實現遍歷所有key。
let name = Symbol(‘name‘); let product = { [name]:"洗衣機", "price":799 }; Reflect.ownKeys(product);
9.有一本書的屬性為:{“name”:“《ES6基礎系列》”, ”price”:56 };要求使用Proxy對象對其進行攔截處理,name屬性對外為“《ES6入門到懵逼》”,price屬性為只讀。
let book = {"name":"《ES6基礎系列》","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改成它。
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.關於Set結構,閱讀下面的代碼,回答問題。。
let s = new Set();
s.add([1]);
s.add([1]);
console.log(s.size);
問:打印出來的size的值是多少?
答:2。如果回答為1的同學,多必是記得Set結構是不會存儲相同的值。 其實在這個案例中,兩個數組[1]並不是同一個值,它們分別定義的數組, 在內存中分別對應著不同的存儲地址,因此並不是相同的值。 所以都能存儲到Set結構中,size為2。
12.關於Map結構,閱讀下面的代碼,回答問題。
let map = new Map();
map.set([1],"ES6系列");
let con = map.get([1]);
console.log(con);
問:打印出來的變量con的值是多少,為什麽?
答:undefined。因為set的時候用的數組[1]和get的時候用的數組[1]是分別兩個不同的數組,只不過它們元素都是1。它們是分別定義的兩個數組,並不是同一個值。新手避免在這裏犯錯。如果想達到預期的效果,你要保證get的時候和set的時候用同一個數組。比如: let map = new Map(); let arr = [1]; map.set(arr,"ES6系列"); let con = map.get(arr); console.log(con); 這樣的得到的變量con的值就是:“ES6系列”。
13.定義一個類Animal,通過傳參初始化它的類型,如:“貓科類”。它有一個實例方法:run,run函數體內容可自行定義。
class Animal { constructor(type){ this.type = type; } run(){ alert(‘I can run‘); } }
14.基於第12題的Animal類,定義一個子類Cat並繼承Animal類。初始化Cat類的昵稱name和年齡age。並擁有實例方法eat,eat函數體內容可自行定義。
答: class Cat extends Animal{ constructor(type,name,age){ super(type); this.name = name; this.age = age; } eat(){ alert(‘I am eating‘); } }
15.利用module模塊,實現兩個模塊A和B,A模塊導出變量name,age和say方法。B模塊只導入變量name和say方法,並且重命名name為nickname。
答: //-----模塊A-------// var name = "kitty"; var age = 15; var say = function(){ //.... }; export {name,age,say} //---module-B.js文件--- import { name as nickname, say } from "模塊A的相對路徑";
ES6進階之路