for in 与for 与hasOwnProperty

在遍历一个对象的时候我们会使用到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数组

原文地址:https://www.cnblogs.com/vivenZ/p/6737199.html