一、箭頭函式與普通functon有什麼區別?箭頭函式可以完全代替普通functon嗎?
//箭頭函式:
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 並沒有影響。
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.箭頭函式沒有原型屬性, 不能做為建構函式
var a = ()=>{
return 1;
}
function b(){
return 2;
}
console.log(a.prototype); // undefined
console.log(b.prototype); // {constructor: ƒ}
複製程式碼
6.箭頭函式不能當做Generator函式,不能使用yield關鍵字
二、Generator是什麼?Generator返回值是什麼?yield?next()返回的資料是怎樣的?
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()方法呼叫,實現函式的分段執行。
三、iterator有哪些表現形式?iterator有什麼作用? 1、什麼是iterator
遍歷器(Iterator)是一種介面,為各種不同的資料結構提供統一的訪問機制。任何資料結構只要部署Iterator介面,就可以完成遍歷操作(即依次處理該資料結構的所有成員)。
2.iterator有什麼作用
Iterator的作用有三個: 一是為各種資料結構,提供一個統一的、簡便的訪問介面; 二是使得資料結構的成員能夠按某種次序排列; 三是ES6創造了一種新的遍歷命令for...of迴圈,Iterator介面主要供for...of消費。
3.iterator體現
在ES6中,有三類資料結構原生具備Iterator介面:陣列、某些類似陣列的物件、Set和Map結構。
四、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()方法
五、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('我錯了');
}
複製程式碼