計算機對于大批量資料的處理速度比起人類不知道快了多少,是以對于重複的操作,使用循環語句處理是很友善的,對于我們前端來說,給同一标簽的元素綁定事件啦,tab切換啦,左右關聯效果啦,等等都可以使用循環語句處理。js裡邊最基礎的循環語句就是for和while兩個了,其他的諸如:for... in周遊對象 ,for...of周遊數組、Set 和 Map 結構、某些類似數組的對象(比如arguments對象、DOM NodeList 對象)等,在此不作讨論。
for( 初始值...;條件...;某一增量...)
首先談一下for循環,對于for循環來說,基本結構如上所示,三條語句都不是必須的,但是兩個分号是必須的。(昨天撸了半天的文字忘記點修改了,結果php部落格的本地儲存功能一點都不好使,哎,今天繼續碼吧)
對于for循環來說,執行的時候小括号裡邊的前兩條語句順序執行,如果滿足第二條條件語句,就執行循環體,完畢執行之後再做增量運算,然後重複以上步驟。而在這裡邊我要額外多說幾句的是前字尾運算符的使用,因為我發現很多非科班出身的程式猿确實對這個不會,舉個例子很容易就看明白了;
let a = 0,b = 0;
console.log( a++ ); //0
console.log( ++b ); //1
a; //1
b;//1
其實就是對值得引用時機不同,字首運算符和變量那個在前就先引用誰的值。通常我們會使用for循環周遊一個數組,或者類數組對象,在寫這篇文章的時候我也想到了一個周遊數組的方法:
function iteratorArr ( arr ) {
if( !arr.length )
return;
let len = arr.length;
if( len % 2 == 0 ){//偶數個元素
for( let i = 0 ; i < len / 2 ; i++ ){
arr[i];
arr[len-i-1];
}
}else{//奇數個元素
for( let i = 0 ; i <= (len - 1) /2; i++ ){
if( i == (len - 1) /2 ){
}else{
arr[i];
arr[ len - i -1 ];
}
}
}
}
這個方法在10000000數量級以下的周遊數組中(我做的是累加操作),比傳統for循環慢點,1000000個數的時候,比傳統的慢了1毫秒,等于10000000這個數量級的時候比傳統的for周遊數組快了兩毫秒。
測試環境是在chrome的console環境裡弄的。是以處理輕量級的資料用for直接周遊就行了。貌似我們前端處理的資料量也遠遠沒有這麼高,是以這個方法基本廢棄,另外,其實我就是把一個數組一分為二,一次循環期間對數組的兩個元素做一次操作,然而這樣一個問題是,假如按照我的思路:就是假設一次循環操作的元素越多,那麼算法性能越好的話,那麼三分法,四分法,甚至五分法是不是性能會更優一點 ? 到底有沒有最優解,這個我目前沒法判斷出來,而且,依照上面的判斷的話,這樣一直分下去似乎是一個無解的題,是以上面這個方法純屬自娛自樂了。但是于我個人而言,還是想寫在這篇文章裡,因為死了幾個腦細胞啊。
值得一說的是,任何東西都會産生一個瓶頸問題,正是因為量變産生質變,為了解決性能問題,是以才産生了這些人類的智慧結晶,比如基本的查找排序算法,鑒于前邊談了一大堆的廢話,下面介紹一個比較有意思的算法題(也算比較經典):
題目描述:簡而言之就是在一個從左到右,從上到下遞增的的二維矩陣裡邊找到一個值,而要求算法的時間複雜度為O(n).
//解法示例
function searchIndex ( arr, key ){
let rows = arr.length - 1;
let cols = arr[0].length-1,i = 0,j = cols ;
while( i <= rows && j >= 0){
if( key > arr[i][j]){
i++;
}else if( key < arr[i][j] ){
j--;
}else{
return { i,j }
}
}
return false;
}
這個解法是一種經典解法,用了兩個指針,說到這裡不得不提一個東西 --- 就是思維固化,人很容易思維固化的,乃至于你使用for循環的時候最開始的三條語句除了初始值,判斷條件,增量之外寫不出其他,一個tab除了全部隐藏,再顯示的寫法之外不會考慮其他的,是的,思維固化很可怕,但也很正常,在日複一日的碼畜工作中逐漸喪失自我,不會思考。是以你的思維需要有東西去擴充,去打破,多看看那些經典算法是一個很不錯的解決方案。回到上面那個問題,一般而言你往一個n*n的二維數組裡找一個元素使用兩重for循環是輕而易舉的事,但是時間複雜度是o(n^2)的,浙大的陳外婆說過,一旦出現這種複雜度的算法你就要警惕了,作為一個成熟的程式猿你得學會優化啊。而使用了兩個指針之後,整個代碼複雜度就降下來了 。當然這是一種特殊情況。
while
基本用法
while(expression){
...
...
}
執行過程:先檢測expressioin的值是否為true來決定是否執行循環體,說實話,我個人不怎麼用。
基本循環語句先到這裡,以後想到的話再補充。