在javasctipt里遍歷是必不可少的一項重要內容, 從剛入前端坑開始,就會學到遍歷的方法,就是for循環,while循環和do while循環,然后就是慢慢的接觸,forEach和for in 剛開始,筆者在自學時,用過for in感覺效果和for循環(下面就簡稱for了)一樣,當時就是認為for和for in的效果一樣,就是寫法不同,但是呢?在一次案例里,才發現有很大的區別,然后就去查,又問(沒什么軟用),反正搗鼓了好幾天,最后算是有一點明白了,下面,就先說一下for和for in的區別
for的語法結構:
for( 初始值;判斷條件;步幅){ code }
for( var i =0;i<5;i++ ){
//i初始值為0;i是否小寫5;每次循環后i加1
console.log(i);// 0 1 2 3 4
}
for in的寫法:
var wq = {
age:20,
name:"咸魚",
sex:"男"
}
for(var attr in wq){//attr是屬性,attr可以換成任意變量名
console.log(attr);// 輸出的是 屬性名:age name sex
console.log(wq[attr]);//屬性相對應的值 20 咸魚 男
}
寫到這里,也許已經有人看出來一些不同了,但是呢?筆者還是想說一下的,因為當時筆者看這還是有點懵,所以為了以防有和我一樣菜的摳腳的人,還是說一下比較好,上面寫的for,循環的是自己定義的一個數值,一般來說,for也就是用來遍歷用的,而且是比較簡單的操作,像遍歷數組就可以用forEach,但是forEach兼容性不是很好,所以在遍歷數組是還是建議用for來做,那為什么不用for in呢?下面會提到的,for是我們經常用到的,並且也是最簡單的一種
而for in就不同了,上面的案例中,對象wq里有三個屬性和相對應的值,想要獲取到這三個屬性及相對應的值for是辦不到的,只有for in才可以,所以說,for in一般都是用在遍歷對象的,另外,for in也可以遍歷數組,但是會存在以下幾個問題。
1、index索引為字符串型數字,不能直接進行幾何運算
2、遍歷順序有可能不是按照實際數組的內部順序
3、使用for in會遍歷數組所有的可枚舉屬性,包括原型。例如上栗的原型方法method和name屬性
這也是為什么用for不用for in的區別,如果是遍歷普通數組的話,用for是最好的選擇,但是如果是對象,就for in就好了。
之前筆者在一個案例中,因為太晚了,就不在找了,當大家有這個問題的時候,就對照自己的問題就OK了,發現,for可以用的時候,for in居然不能用,當時還不知道有這么多的內置原因,這是因為當時在遍歷數組時,碰到有屬性的值,比方說5個值,for出來的就是 0 1 2 3 4 而for in就是 0 1 2 3 4 length 還有這個值自帶的屬性等,就是還有別的屬性,所以在執行到第 4 個 在向下執行的時候,for就向下執行了,而for in執行的就是 length這個屬性,所以就會報錯。
上面說到的,就是筆者自己對for和for in區別的理解,可能有很多地方還沒有說到,不過能幫到小白就好。
大神也可以在下面補充一下,筆者也可以在加深學習一下。