首頁 > web前端 > js教程 > JavaScript中for..in循環陷阱介紹_javascript技巧

JavaScript中for..in循環陷阱介紹_javascript技巧

WBOY
發布: 2016-05-16 17:15:53
原創
1180 人瀏覽過

大家都知道在JavaScript中提供了兩種方式迭代對象:
(1)for 循環;
(2)for..in循環;
使用for循環進行迭代數組對象,想必大家都已經司空見慣了。但是,使用for.. in迴圈時,大家可要注意了,為什麼這麼說呢?大家聽我娓娓道來....
javascript提供了一個特殊的迴圈(也就是for .. in迴圈),用來迭代物件的屬性或陣列的每個元素,for...in循環中的循環計數器是字串,而不是數字。它包含目前屬性的名稱或目前數組元素的索引。
案例一:

複製程式碼 程式碼如下:

//使用使用.. 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 ; ialert(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 一切又完好如初,哎,不知道,同志們看完有什麼感受,是不是有種「撥開雲霧見晴天」的感覺啊,呵呵
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板