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