1. 程式人生 > >第十週(1For each for in for of的解釋和例子以及Constructor 和Arrow function 的restore)

第十週(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。