在遍历一个对象的时候我们会使用到for in属性。
现有对象和数组如下:
var filght = { number: 1, status: 'watit', arrival: [1,2,3], addName: function () { return this.number + 99; } } var arr = [ 'name', 'age', 'number' ]
对于数组来说我们可以使用for来遍历 也可以使用for
for(var i=0; i< arr.length; i++){ console.log(arr[i]); }
for(var k in arr){ console.log(k +':'+arr[k]) }
现在要遍历filght里面的属性,我们可以使用for in 但是不能使用 for来遍历,因为对象没有长度。
for(var k in filght){ console.log(k +':'+filght[k]) }
那么for 和for in 遍历最大的区别是for in可以遍历出原型对象的属性,但是for 不行。
现在我们给Array的原型添加属性。
Array.prototype.sayName = '111'
然后遍历。
for(var k in arr){ console.log(k +':'+arr[k]) } console.log('-----------------------------------------------------'); for(var i=0; i< arr.length; i++){ console.log(arr[i]); }
得到结果
证明 for in 循环的确可以遍历到原型对象上的属性。那么如果我们使用了for in 遍历,但是不想要得到原型上的属性怎么办呢。
对象不可以使用for 循环遍历,所有有一个hasOwnProperty 可以解决。
例如:先给Object原型添加属性
Object.prototype.sayName = function(){ return "viven"; }
然后通过for in遍历
for(var k in filght){ console.log(k +':'+ filght[k]); }
通过hasOwnProperty 过滤
for(var k in filght){ console.log(k +':'+ filght[k]); } console.log('===========================================') for(var k in filght){ if(filght.hasOwnProperty(k)){ console.log(k +':'+ filght[k]); } }
得到结果
现在原型上的属性已经被过滤掉了。这个方法同样适用于Array数组