不要用for in語句對陣列進行遍歷

2021-07-26 23:47:50 字數 1829 閱讀 9862

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 並不能夠保證返回的是按一定順序的索引,但是它會返回所有可列舉屬性,包括繼承屬性。

給原型新增屬性之後,預設情況下列舉,會把原型屬性一併輸出,如下所示。由於它總是會訪問該物件的原型,看下原型上是否有屬性,這在無意中就給遍歷增加了額外的壓力。例:

function

fun4()}//

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。

function

fun4()}}

//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 ...