遍历对象的属性

时间:2022-08-25 15:25:26

for/in可以将在循环体中遍历对象中可枚举的属性(包括继承和自有属性),对象继承的内置方法不可枚举。

var p ={name:"jack",age:23,sex:"boy"}
  var o = {sex:"girl",hobby:"html"}

1.将p可枚举的属性复制到o中,并且覆盖o中相同的属性—————————-

function extend(o,p){
        for(prop in p){
           o[prop] = p[prop]
        }
        return o;    //{{sex: "boy", hobby: "html", name: "jack", age: 23}}
    } 

2.将p可枚举的属性复制到o中,并且o中相同的属性不会被覆盖————————————————

function merge(o,p){
       for(prop in p){
           if(o.hasOwnProperty[prop]) continue;
           o[prop] = p[prop]
       }
       return o;     //{sex: "boy", hobby: "html", age: 23}
   }

3.o中的属性p中没有同名属性,则从o中删除—————————— 删除同名的—————————

 function restrict(o,p){
       for(prop in o){
           //!(prop in p) && delete o[prop];
           //if(!(prop in p)) delete o[prop]
            !p[prop] && delete o[prop]
       }
       return o;
   } 

4.返回一个新对象,且同时具有o/p的属性,有相同的取p中的属性——————

function extend(o,p){
        for(prop in p){
            delete o[prop]
        }
        return o; //{hobby:"html"}
    }  

5.返回一个新对象,且具有同时存在o/p中的属性—————————————————–

var a = (function(o,p){
       return extend(extend({},o),p)
   }(o,p))
    {sex: "boy", hobby: "html", name: "jack", age: 23}  

6.返回一个数组,这个数组中包含o中可枚举的自有属性的名字———————————————

var a =(function(o){
        if(typeof o !== "object") throw TypeError();
        var res = [];
        for(prop in o){
            (o.hasOwnProperty(prop) ) && res.push(prop)
        }
        return res;
    }(o) )

补充
Object.keys() //返回的可枚举的自有属性
Obejct.getOwnProtertyNames() // 返回的*属性

 Object.keys(a)  //["name","age","sex"]
 Obejct.getOwnProtertyNames(a)  //["name","age","sex"]