大家都知道在JavaScript中提供了兩種方式迭代物件:
(1)for 迴圈;
(2)for..in 迴圈;
使用for迴圈進行迭代數組對象,想必大家都已經司空見慣了。但是,使用for.. in迴圈時,大家可要注意了,為什麼這麼說呢?大家聽我娓娓道來....
javascript提供了一種特殊的迴圈(也就是for .. in迴圈),用來迭代物件的屬性或陣列的每個元素,for...in循環中的循環計數器是字串,而不是數字。它包含目前屬性的名稱或目前數組元素的索引。
案例一:
//使用for..in循环遍历对象属性 varperson={ name: "Admin", age: 21, address:"shandong" }; for(vari in person){ console.log(i); }
執行結果為:
name
age
address
當遍歷一個物件的時候,變數i 也就是循環計數器為物件的屬性名
//使用for..in循环遍历数组 vararray = ["admin","manager","db"] for(vari in array){ console.log(i); }
執行結果:
0
1
2
當遍歷一個陣列的時候,變數i 也就是循環計數器為目前陣列元素的索引
案例二:
但是,現在看來for .. in迴圈還挺好用啊,不過,別高興太早,看看下面的例子:
var array =["admin","manager","db"]; //给Array的原型添加一个name属性 Array.prototype.name= "zhangsan"; for(var i in array){ alert(array[i]); }
運行結果:
admin
manager
db
zhangsan
咦,奇觀了,怎麼平白無故的冒出來一個zhangsan
現在,再看看使用for迴圈會怎樣?
vararray = ["admin","manager","db"]; //给Array的原型添加一个name属性 Array.prototype.name = "zhangsan"; for(var i =0 ; i<array.length; i++){ alert(array[i]); };
運行結果:
admin
manager
db
哦, 現在明白了,for..in循環會把某個類型的原型(prototype)中方法與屬性給遍歷出來,所以這可能會導致程式碼中出現意外的錯誤。為了避免這個問題,我們可以使用物件的hasOwnProperty()方法來避免這個問題,如果物件的屬性或方法是非繼承的,那麼hasOwnProperty() 方法會回傳true。即這裡的檢查不涉及從其他物件繼承的屬性和方法,只會檢查在特定物件本身中直接建立的屬性。
案例三:
vararray = ["admin","manager","db"]; Array.prototype.name= "zhangshan"; for(vari in array){ //如果不是该对象自身直接创建的属性(也就是该属//性是原型中的属性),则跳过显示 if(!array.hasOwnProperty(i)){ continue; } alert(array[i]); }
執行結果:
admin
manager
db
一切又完好如初。
以上是JavaScript中for in迴圈是如何使用的?需要注意些什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!