1. 程式人生 > >JS 循環遍歷 總結

JS 循環遍歷 總結

原型 all argument 數組 n) 堆棧 fin 一次循環 進行

一、循環遍歷語句

for...in... (ES5)

語法javascript for(keys in obj){}
適用:遍歷對象
說明
  1.keys表示obj對象的每一個鍵值對的鍵(鍵名),所有循環中,需要使用obj[keys]來取到每一個值。
  2.for-in 循環,遍歷時不僅能讀取對象自身上面的成員屬性,也能延續原型鏈遍歷出對象的原型屬性
  3.使用hasOwnProperty判斷一個屬性是不是對象自身上的屬性。obj.hasOwnProperty(keys)==true 表示這個屬性是對象的成員屬性,而不是原型屬性

for...of... (ES6)

語法javascript for(keys of xxx){}


適用:數組、Set和Map結構、某些類似數組的對象(比如arguments對象、DOM NodeList 對象)、Generator 對象,以及字符串
說明:ES6 借鑒 C++、Java、C# 和 Python 語言,引入了for...of循環,作為遍歷所有數據結構的統一的方法。
 一個數據結構只要部署了Symbol.iterator屬性,就被視為具有iterator接口,就可以用for...of循環遍歷它的成員。
也就是說,for...of循環內部調用的是數據結構的Symbol.iterator方法。
 
其他
for (let [key,value] of Object.entries(obj))
for (let key of Object.keys(obj))
for (let key of Object.values(obj))

1.Object.keys()
返回一個數組,成員是參數對象自身的(不含繼承的)所有可遍歷( enumerable )屬性的鍵名

2.Object.values()
返回一個數組,成員是參數對象自身的(不含繼承的)所有可遍歷( enumerable )屬性的鍵值

3.Object.entries()
返回一個數組,成員是參數對象自身的(不含繼承的)所有可遍歷( enumerable )屬性的鍵值對數組

forEach (ES5)

語法javascript [].forEach(callbackfn[, thisArg])
適用: 遍歷數組,不改變原數組
說明:對數組裏存在的每個元素調用一次 callbackfn。callbackfn 只被實際存在的數組元素

調用;它不會被缺少的數組元素調用。
如果提供了一個 thisArg 參數,它會被當作 this 值傳給每個 callbackfn 調用。如果沒提供它,用 undefined 替代。

callbackfn參數,分別為值、下標、數組本身

[].forEach(function(value, index, array) {
    // ...
});

對比jQuery中的$.each方法:

$.each([], function(index, value, array) {
    // ...
});

缺點:

  1. 不能使用break語句中斷循環
  2. 不能使用return語句返回到外層函數

map (ES5)

語法javascript [].map(callbackfn[, thisArg]);
說明:map方法可以返回一個處理過的新數組,不改變原數組

callbackfn參數,分別為值、下標、數組本身

[].map(function(value, index, array) {
  // ...
  return .....
}); 

二、比較

for...in缺點

  ①數組的鍵名是數字,但是for...in循環是以字符串作為鍵名“0”、“1”、“2”等等。
  ②不僅遍歷數字鍵名,還會遍歷手動添加的其他鍵,甚至包括原型鏈上的鍵。
  ③某些情況下,會以任意順序遍歷鍵名,主要是為遍歷對象而設計的,不適用於遍歷數組。

for...of優點

  ①有著同for...in一樣的簡潔語法,但是沒有for...in那些缺點。
  ②不同於forEach方法,它可以與break、continue和return配合使用。
  ③提供了遍歷所有數據結構的統一操作接口。

三、循環控制語句

1、break:跳出本層循環,繼續執行循環結構後面的語句。如果循環有多層,則break只能跳出一層。

2、continue:跳過本次循環剩余的代碼,跳轉到表達式處進行下一次的循環判斷,繼續執行下一次循環。
   ①對與for循環,continue之後執行的語句,是循環變量更新語句i++;
   ②對於while、do-while循環,continue之後執行的語句,是循環條件判斷;
   因此,使用這兩個循環時,必須將continue放到i++之後使用,否則,continue將跳過i++進入死循環

3、return:在程序(函數)中遇到return語句,那麽代碼就退出該函數的執行,返回到函數的調用處;如果是主程序(main()),那麽結束整個程序的運行。

4、exit: 其他語言中使用,如C、C++等。調用exit()函數將會結束當前進程,同時刪除子進程所占用的內存空間,把返回信息傳給父進程。
當exit()中的參數為0時,表示正常退出,其他返回值表示非正常退出,執行exit()函數意味著進程結束;
而return僅表示調用堆棧的返回,其作用是返回函數值,並且退出當前執行的函數體,返回到函數的調用處,
在main()函數中, return n和exit(n)是等價的。

JS 循環遍歷 總結