for in在js中的作用主要是用来遍历数组或者对象。
数组遍历:
可以看到for... in 遍历数组的时候,key值为数组下标,通过数组下标,可以获取数组的每一项的值
数组循环一般不使用for in
var arr=[11,22,33,44];
for(arrKey in arr) {
console.log(arrKey+":"+arr[arrKey])
}
执行结果:
0:11
1:22
2:33
3:44
对象遍历:
for... in遍历对象的时候,key值为对象的键值,通过对象的键值可以获取对象的value值
for in可以遍历所有自定义属性
var obj={name:"sunshine",age:22};
for(objKey in obj) {
console.log("对象遍历:");
console.log(objKey+":"+obj[objKey])
}
执行结果:
name:sunshine
age:22
需要注意的是。for..in遍历对象的时候,输出的值不一定按照对象定义的顺序:
var b = {3:1,42:2,11:3}
for( var key in b ){
console.log( b[key] )
}
返回结果:1 3 2
原型上已经有的属性方法不会被遍历,但是原型上自定义的属性方法会被遍历:
Object.prototype.test = "I am test"
var b = {"name":"txj"}
for( var key in b ){
console.log(key + " : "+ b[key])
}
返回结果:
name : txj
test : I am test
在实例中定义原型中已有的方法,浏览器for in 情况不一致:
在现代浏览器中可以遍历出重新定义的原型上的方法,但是在低版本浏览器却不行
var b = {"name":"txj"}
b.toString = function(){ alert("I am toString") }
for( var key in b ){
alert(key + " : "+ b[key])
}
因为for in会遍历原型上自定义的属性方法,我们可以借助对象的hasOwnProperty()方法来只遍历对象自身定义的属性和方法。
Object.prototype.myClone = function() {}
var obj = {
name: 'jack',
age: 33
}
// name, age, clone
for (var key in obj) {
if(obj.hasOwnProperty(key)){
console.log(key+":"+obj[key]);
}
}