for...in 語句用于對數(shù)組或者對象的屬性進行循環(huán)操作。
for ... in 循環(huán)中的代碼每執(zhí)行一次,就會對數(shù)組的元素或者對象的屬性進行一次操作。
Tip:for-in循環(huán)應該用在非數(shù)組對象的遍歷上,使用for-in進行循環(huán)也被稱為“枚舉”。·
語法:
for (變量 in 對象) { 在此執(zhí)行代碼}
“變量”用來指定變量,指定的變量可以是數(shù)組元素,也可以是對象的屬性。
實例:使用 for ... in 循環(huán)遍歷數(shù)組。
<html><body><script type="text/javascript">var x var mycars = new Array() mycars[0] = "Saab" mycars[1] = "Volvo" mycars[2] = "BMW" for (x in mycars) { document.write(mycars[x] + "<br />") }</script></body></html>
注意一:for in循環(huán)不會按照屬性的下標來排列輸出。
//code from http://caibaojian.com/js-loop-for-in.html"first":"first", "zoo":"zoo", "2":"2", "34":"34", "1":"1", "second":"second"};for (var i in obj) { console.log(i); };
執(zhí)行時按chrome執(zhí)行,先把當中的非負整數(shù)鍵提出來,排序好輸出,然后將剩下的定義時的順序輸出。由于這個奇葩的設定,讓avalon的ms-with對象排序不按預期輸出了。只能強制用戶不要以純數(shù)字定義鍵名。
實例1:在數(shù)組的原型對象上定義了一個新的屬性,使用for循環(huán)沒出現(xiàn)問題
function getNewArray(){var array=[1,2,3,4,5];Array.prototype.age=13; var result = [];for(var i=0;i<array.length;i++){ result.push(array[i]); }alert(result.join('')); }
實例2:采用了for in循環(huán),但是給我們期望的一樣還是得到了12345的正確結(jié)果
function getArrayTwo(){var array=[1,2,3,4,5 ]; var result=[]; for(var i in array){ result.push(array[i]); }alert(result.join('')); }
實例3:給原型添加屬性之后,默認情況下枚舉,最后輸出1234513
function getNewArrayTwo(){var array=[1,2,3,4,5 ]; Array.prototype.age=13;var result=[]; for(var i in array){ result.push(array[i]); }alert(result.join('')); }
所以建議不要對數(shù)組執(zhí)行for in循環(huán),事實上,在高性能javascript這本書中,也強調(diào)了for in循環(huán)的不好,因為它總是會訪問該對象的原型,看下原型上是否有屬性,這在無意中就給遍歷增加了額外的壓力。
解決方法:
如果某個對象具有給定名稱的屬性,那么Object.prototype.hasOwnProperty(name)返回true。如果該對象是從原型鏈中繼承了該屬性,或者根本沒有這樣的一個屬性,則返回false。通過hasOwnProperty限定for in循環(huán)在當前中遍歷,而不用去考慮它的原型屬性。
function finalArray(){var array=[1,2,3,4,5 ]; Array.prototype.age=13; var result=[];for(var i in array){if(array.hasOwnProperty(i)){ result.push(array[i]); } }alert(result.join('')); }
注意事項:
1.有一部分瀏覽器,例如早期的safari瀏覽器,不支持這個方法
2.對象經(jīng)常被用作哈希值,這就是存在hasOwnProperty被另外的屬性屏蔽的風險(但是我估計沒有人那么無聊使用這個屬性)
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com