第十週(1For each for in for of的解釋和例子以及Constructor 和Arrow function 的restore)
注:引用自https://www.cnblogs.com/ruoqiang/p/6217929.html。 https://blog.csdn.net/zengyonglan/article/details/53465505 。 https://blog.csdn.net/qq_18663357/article/details/54928572
forEach遍歷陣列
[].forEach(function(value, index, array) { // ... });
例子
var myArry =[1,2,3,4]; myArry.desc ='four'; myArry.forEach((value,index,arr)=>{ console.log(value); }); //1 //2 //3 //4
forEach遍歷陣列,而不是遍歷物件哦,而且在遍歷的過程中不能被終止,必須每一個值遍歷一遍後才能停下來
注意其與jQuery的$.each類似,只不過引數正好是相反的
$.each([], function(index, value, array) { // ... });
$.each遍歷陣列或者類陣列
第1個和第2個引數正好是相反的,這裡要注意了,不要記錯了。
for in遍歷物件
迴圈遍歷物件的key,是鍵值對前面的那一個哦
一般不推薦遍歷陣列,因為for in遍歷後的不能保證順序,而且原型鏈上的屬性也會被遍歷到,因此一般常用來遍歷非陣列的物件並且使用hasOwnProperty()方法去過濾掉原型鏈上的屬性
var myArry =[1,2,3,4]; myArry.desc ='four'; for(var value in myArry){ //迴圈key console.log(value) } //"0" //"1" //"2" //"3" //"desc" 注意這裡新增上去的屬性也被遍歷出來了
for of遍歷物件
迴圈遍歷物件的值,是遍歷鍵值對後面的那一個value哦 ,與for in遍歷key相反
var myArry =[1,2,3,4]; myArry.desc ='four'; for(var value of myArry){ console.log(value) } //1 //2 //3 //4
- 這是最簡潔、最直接的遍歷陣列元素的語法
- 這個方法避開了for-in迴圈的所有缺陷
- 與forEach()不同的是,它可以正確響應break、continue和return語句
在 Javascript 語言中,constructor 屬性是專門為 function 而設計的,它存在於每一個 function 的prototype 屬性中。這個 constructor 儲存了指向 function 的一個引用。
在定義一個函式(程式碼如下所示)時,
function F() {
// some code
}
JavaScript 內部會執行如下幾個動作:
1.為該函式新增一個原形(即 prototype)屬性
2. 為 prototype 物件額外新增一個 constructor 屬性,並且該屬性儲存指向函式F 的一個引用
這樣當我們把函式 F 作為自定義建構函式來建立物件的時候,物件例項內部會自動儲存一個指向其建構函式(這裡就是我們的自定義建構函式 F)的 prototype 物件的一個屬性proto,
所以我們在每一個物件例項中就可以訪問建構函式的 prototype 所有擁有的全部屬性和方法,就好像它們是例項自己的一樣。當然該例項也有一個 constructor屬性了(從 prototype 那裡獲得的),每一個物件例項都可以通過 constrcutor 物件訪問它的建構函式,請看下面程式碼:
var f = new F();
alert(f.constructor === F);// output true
alert(f.constructor === F.prototype.constructor);// output true
我們可以利用這個特性來完成下面的事情:
物件型別判斷,如
if(f.constructor === F) {
// do sth with F
}
其實 constructor 的出現原本就是用來進行物件型別判斷的,但是 constructor 屬性易變,不可信賴。
用arrow function寫function比原來的寫法要簡潔清晰很多:
function(i){ return i + 1; } //ES5
(i) => i + 1 //ES6
簡直是簡單的不像話對吧…
如果方程比較複雜,則需要用{}把程式碼包起來:
function(x, y) {
x++;
y--;
return x + y;
}
(x, y) => {x++; y--; return x+y}
除了看上去更簡潔以外,arrow function還有一項超級無敵的功能!
長期以來,JavaScript語言的this物件一直是一個令人頭痛的問題,在物件方法中使用this,必須非常小心。例如:
class Animal {
constructor(){
this.type = 'animal'
}
says(say){
setTimeout(function(){
console.log(this.type + ' says ' + say)
}, 1000)
}
}
var animal = new Animal()
animal.says('hi') //undefined says hi
執行上面的程式碼會報錯,這是因為setTimeout中的this指向的是全域性物件。所以為了讓它能夠正確的執行,傳統的解決方法有兩種:
第一種是將this傳給self,再用self來指代this
says(say){
var self = this;
setTimeout(function(){
console.log(self.type + ' says ' + say)
}, 1000)
第二種方法是用bind(this),即
says(say){
setTimeout(function(){
console.log(self.type + ' says ' + say)
}.bind(this), 1000)
但現在我們有了箭頭函式,就不需要這麼麻煩了:
class Animal {
constructor(){
this.type = 'animal'
}
says(say){
setTimeout( () => {
console.log(this.type + ' says ' + say)
}, 1000)
}
}
var animal = new Animal()
animal.says('hi') //animal says hi
當我們使用箭頭函式時,函式體內的this物件,就是定義時所在的物件,而不是使用時所在的物件。
並不是因為箭頭函式內部有繫結this的機制,實際原因是箭頭函式根本沒有自己的this,它的this是繼承外面的,因此內部的this就是外層程式碼塊的this。