• 对象枚举属性


    枚举属性

    可枚举属性

    在对象属性中,除了检测对象的属性是否存在,常常还会需要遍历对象的属性,通常使用for/in循环来遍历对象中所有可枚举的属性,包括自有属性和继承属性,但是对象继承的内置属性方法不可枚举。

    var o = {
          x:1,
          y:2,
     };
     o.name = 'xiaoming';
     console.log(o.propertyIsEnumerable("toString"));  //false(不可枚举)
    
     //for in 循环可以在循环体中遍历对象中所有可枚举的属性
     for(a in o)  console.log(a);   //x  y  name

    在上面的例子中,toString为对象o继承的内置属性方法,为不可枚举属性,不能遍历出来。现在有很多的工具库给object.prototype添加了新的方法或者属性,这些方法和属性可以被所有对象继承并使用,然而在ECMAScript 5标准之前,这些新的方法不能定义为不可枚举的,即可通过for/in循环出来。为了避免这种情况,我们需要过滤掉这些属性和方法。

    for(a in o){
         if(!o.hasOwnProperty(a)) continue;  //跳过继承属性
         console.log(a);    //x  y  name
    } for(a in o){ if(typeof o[a] ==='function') continue; //跳过方法 }

    对象属性排序

    在使用for/in遍历一个对象的属性的时候,属性名出现的顺序是不确定,如果想要确保属性以特定的顺序出现,最好的办法是避免使用for/in语句,而是创建一个数组,在其中以正确的顺序包含属性名。

    var i;
    var o = {
      'middle-name':'枚',
      'last-name':'举',
      'first-name':'可'
    };
    var message = ['first-name','middle-name','last-name'];
    for(i=0,j=message.length;i<j;i++){
      console.log(message[i] + ':' + o[message[i]]);
    }

    用来枚举属性的对象工具函数

    var p = {
      name:'limei',
      age:23,
      height:180,
      like:{
        food:'水果',
        sports:'跑步',
      }
    };
    var o = {
      x:1,
      y:2,
    }
    o.name = 'xiaoming';

    下面所有的函数都是建立在上面两个对象的基础上实现的:

    1,把p中的可枚举属性复制到o中,并返回o,如果两者含有同名属性,则覆盖o中的属性。

    
    

    function extend(o,p){
      for(prop in p){         //遍历p中的属性
        o[prop] = p[prop];    //将属性添加到o中
      }
      return o;
    }
    var a = extend(o,p);
    console.log(a);

    2,把p中的可枚举属性复制到o中,并返回o,如果两者含有同名属性,o中的属性不受影响。

    
    

    function merge(o,p){
      for(prop in p){                    //遍历p中属性
        if(o.hasOwnProperty[prop]) continue;    //过滤掉o中已经存在的属性
        o[prop] = p[prop];              //将属性添加到o中
      }
      return o;
    }
    var a = merge(o,p);
    console.log(a);

     

    3,如果o中的属性在p中没有同名属性,则从o中删除这个属性,并返回o。

    function restrict(o,p){
      for(prop in o){                         //遍历o中的所有属性
        if(! (prop in p)) delete o[prop];   //如果该属性在p中不存在,则从o中删除
      }
      return o;
    }
    var a = restrict(o,p);
    console.log(a);

    
    

    4,如果o中的属性在p中存在同名属性,则从o中删除这个属性,并返回o。

    function subtract(o,p){
      for(prop in p){        //遍历p中的所有属性
        delete o[prop];    //从o中删除(删除一个不存在的属性不会报错)
      }
      return o;
    }
    var a = subtract(o,p);
    console.log(a);

  • 相关阅读:
    Apache工作原理
    Mysql主从复制
    Apache 工作模式
    Codeforces 932E Team Work
    【TJOI2018】教科书般的亵渎
    Codeforces 960G Bandit Blues
    斯特林数&斯特林反演
    【BZOJ4916】神犇与蒟蒻
    【BZOJ3944】Sum
    【BZOJ4805】欧拉函数求和
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/8432269.html
Copyright © 2020-2023  润新知