JavaScript中for..in循環陷阱介紹


for...in循環中的循環計數器是字符串,而不是數字它包含當前屬性的名稱或當前數組元素的索引,下面有個不錯的示例大家可以參考下
 
大家都知道在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); 

執行結果: 



當遍歷一個數組的時候,變量 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 
一切又完好如初,哎,不知道,同志們看完有什么感受,是不是有種“撥開雲霧見晴天”的感覺啊,呵呵


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM