es6應該搞清楚的問題

1、箭頭函數與普通functon有什麼區別?箭頭函數能夠徹底代替普通functon嗎?es6

//箭頭函數:
let fun = () => {
    console.log('lalalala');
}

//普通函數:
function fun() {
    console.log('lalla');
}
複製代碼

1.箭頭函數是匿名函數,不能做爲構造函數,不能使用new 2.箭頭函數不綁定arguments,取而代之用rest參數...解決編程

function A(a){
  console.log(arguments);
}
A(1,2,3,4,5,8);  //  [1, 2, 3, 4, 5, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]

let B = (b)=>{
  console.log(arguments);
}
B(2,92,32,32);   // Uncaught ReferenceError: arguments is not defined

let C = (...c) => {
  console.log(c);
}
C(3,82,32,11323);  // [3, 82, 32, 11323]
複製代碼

3.箭頭函數不綁定this,會捕獲其所在的上下文的this值,做爲本身的this值數組

var obj = {
  a: 10,
  b: () => {
    console.log(this.a); // undefined
    console.log(this); // Window  },
  c: function() {
    console.log(this.a); // 10
    console.log(this); // {a: 10, b: ƒ, c: ƒ}
  }
}
obj.b(); 
obj.c();
複製代碼

4.箭頭函數經過 call() 或 apply() 方法調用一個函數時,只傳入了一個參數,對 this 並無影響。promise

let obj2 = {
    a: 10,
    b: function(n) {
        let f = (n) => n + this.a;
        return f(n);
    },
    c: function(n) {
        let f = (n) => n + this.a;
        let m = {
            a: 20
        };
        return f.call(m,n);
    }
};
console.log(obj2.b(1));  // 11
console.log(obj2.c(1)); // 11
複製代碼

5.箭頭函數沒有原型屬性, 不能作爲構造函數bash

var a = ()=>{
  return 1;
}

function b(){
  return 2;
}

console.log(a.prototype);  // undefined
console.log(b.prototype);   // {constructor: ƒ}
複製代碼

6.箭頭函數不能當作Generator函數,不能使用yield關鍵字數據結構

2、Generator是什麼?Generator返回值是什麼?yield?next()返回的數據是怎樣的?app

1.什麼是Generator 函數異步

function* helloGenerator() {
       console.log("this is generator");
}
//這個函數與普通的函數區別是在定義的時候有個*,咱們來執行下這個函數。
helloGenerator();//沒有執行

//咱們把代碼改爲下面:
var h = helloGenerator();
h.next();
//這個時候如期的打印了日誌
複製代碼

僅僅是建立了這個函數的句柄,並無實際執行,須要進一步調用next(),才能觸發方法。異步編程

function* helloGenerator() {
       yield "hello";
       yield "generator";
       return;
   }
   var h = helloGenerator();
   console.log(h.next());//{ value: 'hello', done: false }
   console.log(h.next());//{ value: 'generator', done: false }
   console.log(h.next());//{ value: 'undefined', done: true }
複製代碼

通過上面的分析,yield實際就是暫緩執行的標示,每執行一次next(),至關於指針移動到下一個yield位置。函數

Generator函數是ES6提供的一種異步編程解決方案。經過yield標識位和next()方法調用,實現函數的分段執行。

3、iterator有哪些表現形式?iterator有什麼做用? 一、什麼是iterator

遍歷器(Iterator)是一種接口,爲各類不一樣的數據結構提供統一的訪問機制。任何數據結構只要部署Iterator接口,就能夠完成遍歷操做(即依次處理該數據結構的全部成員)。

2.iterator有什麼做用

Iterator的做用有三個: 一是爲各類數據結構,提供一個統一的、簡便的訪問接口; 二是使得數據結構的成員可以按某種次序排列; 三是ES6創造了一種新的遍歷命令for...of循環,Iterator接口主要供for...of消費。

3.iterator體現

在ES6中,有三類數據結構原生具有Iterator接口:數組、某些相似數組的對象、Set和Map結構。

4、iteration與Generator有什麼共性,有什麼聯繫 都涉及到了next()

function* helloGenerator() {
       yield "hello";
       yield "generator";
       return;
   }
   var h = helloGenerator();
   for(var value of h){
   	  console.log(value);//"hello","generator"
   }
複製代碼

helloGenerarot對象是支持for-of循環的,也說明Generator函數在原型上實現了迭代器接口,上面調用的next()方法其實就是迭代器的next()方法

5、Promise與callback有什麼區別?如何將現有的callback封裝成promise? 1.回調函數:函數A做爲參數(函數引用)傳遞到另外一個函數B中, 而且這個函數B執行函數A。咱們就說函數A叫作回調函數。若是沒有名稱(函數表達式),就 叫作匿名回調函數。

function fn1(fn2) {//fn2:回調函數
 setTimeout(function() {
   fn2();
 }, 1000);
}
function fnA(){
  console.log(2);
}
fn1(fnA());
複製代碼

2.promise:異步編程的一種解決方案(es6)。可取代callback promise構造函數:比傳統的回調函數更合理,更強大。 建立promise實例對象,構造函數的參數又是一個函數對象,函數對象裏面又有兩個參數,一個 表明成功的回調,一個是失敗的回調。 promise狀態:pending(進行中) resolve(成功,已解決) reject(失敗,未解決) , 狀態一旦設定,不可改變。 pending-->resolve 進行中-->成功 pending-->reject 進行中-->失敗

var promise = new Promise(function(resolve, reject) { 
  //resolve:成功,名字等於函數體,reject:失敗,同樣的
   setTimeout(function() {
     console.log(1);
      resolve('我是resolve'); //成功--then
      reject('我是reject'); //失敗--catch
    }, 1000);
});
promise.then(function(str) { //成功的指向。  獲取傳遞的參數。
  console.log(2);
  console.log(str); //我是resolve
})
.catch(function() { //失敗的失敗。
   console.log('我錯了');
}
複製代碼
相關文章
相關標籤/搜索