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('我錯了');
}
複製代碼