for ... in 循環中的代買每執行一次,就會對數組的元素或者對象的屬性進行一次循環操做。javascript
eg:應該用在非數組對象的遍歷上,使用for-in進行循環也被稱爲「枚舉」。 html
for (變量 in 對象) { 在此執行代碼 }
「變量」用來指定變量,指定的變量能夠是數組元素,也能夠是對象的屬性。
var
data = {
'4'
:
'first'
,
'3'
:
'second'
,
'2'
:
'third'
,
'1'
:
'fourth'
};
for
(
var
i
in
data) {
console.log(i +
" "
+ data[i])
}
|
IE11, chrome31, firefox23的打印以下:java
1 fourth
2 third
3 second
4 first
|
var
obj = {
"first"
:
"first"
,
"zoo"
:
"zoo"
,
"2"
:
"2"
,
"34"
:
"34"
,
"1"
:
"1"
,
"second"
:
"second"
};
for
(
var
i
in
obj) { console.log(i); };
|
IE11, chrome31, firefox23的打印以下:chrome
1
2
34
first
zoo
second
|
事實上,它不必定根據定義時的順數輸出,全部瀏覽器的最新版本如今都按chrome執行,先把當中的非負整數鍵提出來,排序好輸出,而後將剩下的定義時的順序輸出。因爲這個奇葩的設定,讓avalon的ms-with對象排序不按預期輸出了。只能強制用戶不要以純數字定義鍵名。數組
因此建議不要對數組執行for in循環,事實上,在高性能javascript這本書中,也強調了for in循環的很差,由於它老是會訪問該對象的原型,看下原型上是否有屬性,這在無心中就給遍歷增長了額外的壓力。瀏覽器
若是某個對象具備給定名稱的屬性,那麼Object.prototype.hasOwnProperty(name)返回true。若是該對象是從原型鏈中繼承了該屬性,或者根本沒有這樣的一個屬性,則返回false。經過hasOwnProperty限定for in循環在當前中遍歷,而不用去考慮它的原型屬性。性能
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瀏覽器,不支持這個方法firefox
2.對象常常被用做哈希值,這就是存在hasOwnProperty被另外的屬性屏蔽的風險(可是我估計沒有人那麼無聊使用這個屬性)
文章來源:http://caibaojian.com/js-loop-for-in.html