學習js的心路歷程
while/do while while、do while主要的功能是,當滿足while後邊所跟的條件時,來執行相關業務。這兩個的區別是,while會先判斷是否滿足條件,然後再去執行花括號裡面的任務,而do while則是先執行一次花括號中的任務,再去執行while條件,判斷下次還是否再去執行do裡面的操作。也就是說 do while至少會執行一次操作,生產中這個就可能用的比較少了,因為他與接下來要講的for迴圈相比,個人覺得可讀性上差了一點。
while(條件){ 執行... } ------------ do{ 執行... } while(條件) 1 2 3 4 5 6 7 8 for for (語句 1; 語句 2; 語句 3) { 被執行的程式碼塊 } 1 2 3 4 語句 1 在迴圈(程式碼塊)開始前執行 語句 2 定義執行迴圈(程式碼塊)的條件 語句 3 在迴圈(程式碼塊)已被執行之後執行 這個就不贅述了,也比較好理解,主要聊一下for…in/for…of這兩個東西。
for…in for…in的作用主要是去遍歷物件的可列舉屬性。即
var foo = { name: 'bar', sex: 'male' } Object.defineProperty(foo, "age", { value : 18}) for(var a in foo){ console.log(`可列舉屬性:${a}`) } console.log(`age屬性:${foo.age}`) 1 2 3 4 5 6 7 8 9 因為Object.defineProperty,建立的屬性,預設不可列舉,因此在瀏覽器中列印的結果為: 在JS當中,陣列也算作物件,但一般不推薦把for…in用在陣列遍歷上面,如果for…in普通陣列的話,a返回陣列的索引。
for…of for…of是ES6新增的方法,主要作用是用來遍歷具有iterator介面的資料集合,除了ES5的Array,還有ES6新增的Map,Set等,但是for…of不能去遍歷普通的物件(普通物件不具備iterator介面),如果想去遍歷普通物件,可以使用generator函式去給普通物件先生成iterator介面。for…of的好處是可以使用break跳出迴圈。
every/some 返回一個布林值。當我們需要判定陣列中的元素是否滿足某些條件時,可以使用every/some。這兩個的區別是,every會去判斷判斷陣列中的每一項,而some則是當某一項滿足條件時返回。例如:
let foo=[5,1,3,7,4].every(function (item,index) { console.log(`索引:${index},數值:${item}`) return item>2 }) console.log(foo) 1 2 3 4 5 列印結果為: 當第二項不滿足條件式跳出迴圈,返回false。
let foo=[5,1,3,7,4].some(function (item,index) { console.log(`索引:${index},數值:${item}`) return item>2 }) console.log(foo) 1 2 3 4 5 列印結果為: 當陣列的某項滿足條件時跳出迴圈,返回true. 在按照約定條件篩選陣列時,every/some是非常方便的方法。
filter 篩選出一個滿足相關條件的新陣列。
let foo=[5,1,3,7,4].filter(function (item,index) { console.log(`索引:${index},數值:${item}`) return item>2 }) console.log(foo) 1 2 3 4 5 將滿足返回值條件的item組成一個新的陣列。過濾器,顧名思義,比較好理解。在按照約定條件篩選陣列元素時,filter比較方便。filter() 不會改變原始陣列。
map let foo=[5,1,3,7,4].map(function (item,index) { console.log(`索引:${index},數值:${item}`) return item+2 }) console.log(foo) 1 2 3 4 5 返回一個將每個元素進行“二次加工”的新陣列,map與filter都是返回一個新的陣列,區別則是filter是將原陣列,通過相關條件篩選出合法的item,來組成一個新的陣列,而map則是將每個item通過再加工來返回一個新的陣列。
reduce 將陣列元素做“疊加”處理,返回一個值。
let foo=[5,1,3,7,4].reduce(function (pre,cur) { console.log(`索引:${pre},數值:${cur}`) return pre+cur }) console.log(foo) 1 2 3 4 5 列印結果為: pre為累加值,cur為當前值。reduce函式值得注意的是,reduce(fn,init)第二個引數,可以傳一個初始值,如果程式碼改成這樣:
let foo=[5,1,3,7,4].reduce(function (pre,cur) { console.log(`索引:${pre},數值:${cur}`) return pre+cur },'') console.log(foo) 1 2 3 4 5 則為:
indexOf 返回指定字串首次出現的位置
let foo=['57','17','37','7','4'].indexOf('7') console.log(foo) 1 2 這個函式比較常用的應用場景是,在做if判斷時,可以代替||,&&等關係符。比如: 可以代替 if(value==’next’||value==’pre’)的這種寫法,當判斷元素較多時,這種寫法比較划算。
總結 個人非常喜歡filter/map/reduce,但是看到身邊的同學一言不合就foreach,替這三個函式心疼幾秒。。。不過低版本瀏覽器也確實不支援這些函式。。。根據自己需要去選擇合適的遍歷方式可以大大提升效率。哦耶 --------------------- 作者:j_bleach 來源:CSDN 原文:https://blog.csdn.net/j_bleach/article/details/61615347 版權宣告:本文為博主原創文章,轉載請附上博文連結!