1. 程式人生 > >ES6進階之路

ES6進階之路

變量 一個 簡便 ati -s 系列 完成 turn 推導

1.說出至少5個ES6的新特性,並簡述它們的作用。

1、 let關鍵字,用於聲明只在塊級作用域起作用的變量。
2、 const關鍵字,用於聲明一個常量。
3、 結構賦值,一種新的變量賦值方式。常用於交換變量值,提取函數返回值,設置默認值。
4、 Symbol數據類型,定義一個獨一無二的值。
5、 Proxy代理,用於編寫處理函數,來攔截目標對象的操作。
6for...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進階之路