JavaScript之枚举属性的对象函数

JavaScript中通常会对对象的一些枚举属性进行操作,例如复制、删除、替换等。这需要使用for/in将属性进行循环枚举,下面将介绍几种简单的函数方法。

1. 将a中的可枚举属性复制到b中(b的同名属性将被覆盖)
function extend(b,a){
    for(item in a){                  //遍历a中的属性
        b[item] = a[item];           //赋值给b对象
    }
    return b;                        //返回对象b
}

上述代码中,遍历a中的属性,然后赋值给对象b。如果出现同名属性,b的属性将会被覆盖。
最后返回对象b。

2. 将a中的可枚举属性复制到b中(b的同名属性不会被覆盖)——类似取并集
function merge(b,a){
    for(item in a){                  //遍历a中的属性
        if(item in b) continue;      //若b中存在同名属性,则跳过
        b[item] = a[item];
    }
    return b;
}

上述代码中,将a的属性复制给b对象,但并不覆盖b的原有属性。类似于取得对象a、b的并集属性。示意图如下:
取并集示意图
其中,只要对象b存在a的同名属性(无论是自有属性或者是继承属性),都不会被覆盖。若要只保留b的自有属性,则可使用hasOwnProperty()进行判断,代码如下:

function merge(b,a){
    for(item in a){                               //遍历a中的属性
        if(b.hasOwnProperty(item)) continue;      //若b中存在同名属性,则跳过
        b[item] = a[item];
    }
    return b;
}
3. 将对象b中的非a、b同名属性删除——类似取交集
function restrict(b,a){
    for(item in b){              //遍历b中的属性
        if(!(item in a))         //若a中不存在该属性,则删除b中属性
            delete b[item];
    }
    return b;
}

上述代码中,将对象b中的属性在a中没有同名属性的删除,类似于取得a、b的交集属性。示意图如下:
a、b对象的交集示意图
但是,该函数只保留了b中的属性值,而忽略了a的属性值。

4. 将对象b中a、b的同名属性删除
function subtract(b,a){
    for(item in a){        //遍历a中的属性
        delete b[item];    //直接删除b中的同名属性,若没有则静默
    }
    return b;
}
5. 返回a、b并集的新对象(覆盖b的同名属性)
function union(b,a){
    return extend(extend({},b),a);
}

上述代码中返回一个新对象,保存着对象a、b的并集属性。
其中extend({},b) 返回一个复制了对象b的新对象。之后再调用extend()函数,将a中的属性复制到新对象中(同名属性则覆盖)。

6. 返回a、b交集的新对象(不覆盖b的同名属性)
function intersection(b,a){
    return restrict(extend({},b),a);
}

上述代码中同样返回一个新对象,保存对象a、b的交集属性,并且只保留b中的属性值,而忽略a中的属性值。

7. 返回a中可枚举的属性名字的数组
function keys(a){
    if(typeof a!=="object") throw TypeError();
    var myArray = [];
    for(item in a){
        myArray.push(item);
    }
    return myArray;
}

上述代码返回了对象a中的枚举属性,若要返回对象a的可枚举自有属性,代码可如下:

function keysArray(a){
    if(typeof a!=="object") throw TypeError();
    var myArray = [];
    for(item in a){
        if(a.hasOwnProperty(item))
            myArray.push(item);
    }
    return myArray;
}

上述代码以数组形式返回了对象a的可枚举的自有属性。


上述函数都只是浅复制属性内容,属性值类似于数组或对象类型,复制的是引用值,若要完全脱离需要进行深度克隆。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJWeigege

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值