for...in主要用於對陣列和物件的屬性進行遍歷。for ... in 迴圈中的**每執行一次,就會對陣列的元素或者物件的屬性進行一次操作。
語法:for (variable in object)
variable:
每次迭代,乙個不同的屬性名將會賦予
variable。object:
可列舉屬性被迭代的物件。
對陣列操作
var a=[5,4,3,2,1];var x=0;
console.log(
typeof x);//
number
for (x in
a) console.log(x);//4
console.log(typeof x);//
string
//output:
//a[0]: 5
//a[1]: 4
//a[2]: 3
//a[3]: 2
//a[4]: 1
可以發現在for in函式中變數以字串的形式出現,這時候在函式中操作a[x+1]的話是無效的,x+1會進行字串拼接。
物件操作
var obj=;for (var i in
obj) ;
//output:
//1:first
//2:second
//3:2
//4:1
//two:zoo
//three:34
可發現,for...in 並不能夠保證返回的是按一定順序的索引,但是它會返回所有可列舉屬性,包括繼承屬性。
給原型新增屬性之後,預設情況下列舉,會把原型屬性一併輸出,如下所示。由於它總是會訪問該物件的原型,看下原型上是否有屬性,這在無意中就給遍歷增加了額外的壓力。例:
functionfun4()}//
outuput:
//a[0]: 1
//a[1]: 2
//a[2]: 3
//a[3]: 4
//a[4]: 5
//a[age]: 13
解決方法:
如果你只要考慮物件本身的屬性,而不是它的原型,那麼使用getownpropertynames()
或執行hasownproperty()
來確定某屬性是否是物件本身的屬性 (也能使用propertyisenumerable
)。
下面利用hasownproperty()
的方法使隱藏的繼承屬性不會被顯示。如果該物件是從原型鏈中繼承了該屬性,或者根本沒有這樣的乙個屬性,則返回false。如果某個物件具有給定名稱的屬性,則返回true。
functionfun4()}}
//outuput:
//a[0]: 1
//a[1]: 2
//a[2]: 3
//a[3]: 4
//a[4]: 5
在迭代進行時被新增到物件的屬性,可能在之後的迭代被訪問,也可能被忽略。通常,在迭代過程中最好不要在物件上進行新增、修改或者刪除屬性的操作,除非是對當前正在被訪問的屬性。這裡並不保證是否乙個被新增的屬性在迭代過程中會被訪問到,不保證乙個修改後的屬性(除非是正在被訪問的)會在修改前或者修改後被訪問,不保證乙個被刪除的屬性將會在它被刪除之前被訪問。
note: 意思就是盡量不要對陣列物件使用for in遍歷。
Interger物件不要用 進行比較
為了更好的空間和時間效能,integer會快取頻繁使用的數值,數值範圍為 128到127,在此範圍內直接返回快取值。integercache.low 是 128,integercache.high是127,如果在這個區間內,他就會把變數i當做乙個變數,放到記憶體中 但如果不在這個範圍內,就會去new...
對陣列進行總結
一維陣列 1 陣列 arr n 其中n為常量。注 陣列未初始化為隨機值。2 char 型別的陣列 例 char arr1 char arr2 a b c printf s n arr1 printf d n strlen arr1 注 s 遇到 0 才可以結束 字串求長度 0 為標誌,但不算做乙個字...
對陣列進行排序
函式名稱 排序依據 陣列索引鍵保持 排序的順序 相關函式 array multisort 值鍵值關聯的保持,數字型別的不保持 第乙個陣列或者由選項指定 array walk asort 值是 由低到高 arsort arsort 值是 由高到低 asort krsort 鍵是 由高到低 ksort ...