话不多说,直接上代码!
一、对象的复制
把对象 a 中的可枚举属性复制到 b 中,如果有同名属性,就将其覆盖,不处理getter和setter以及复制属性。可能有人想到直接用 = 号进行赋值,如果直接采用 b = a 的方式进行复制,会导致修改 b 的同时 a 也会改变,这里涉及到对象数据类型(也有人称之为引用数据类型或复杂数据类型)的浅拷贝问题,所以很容易产生BUG。以下代码可解决此问题:
function extend(a, b) {
for (let i in a) {
b[i] = a[i];
}
return b;
}
注意,以上代码只可复制对象内的键值对,不能复制对象的特性(可写性、可枚举性、可配置性)和存取属性(getter,setter)。
在ES6中,对象新增了合并方法Object.assign(obj1, obj2, obj3......), 可以利用这个方法, 达到相同的效果。例如:b = Object.assign({}, a)。
二、对象的合并,且不影响主对象
还是用对象 a 、b 举例子,将对象 b 合并到 a 中,如果有同名属性, a 不受影响。此函数同样不处理getter和setter以及复制属性。
function merge(a, b) {
for (let i in b) {
if (a.hasOnwProperty[i]) continue; // 判断 a 中是否有 i 属性
a[i] = b[i];
}
return a;
}
之前提到过object.hasOnwProperty()可以判断属性是否存在。
三、两对象属性去重
如果 a 中的属性在 b 中存在同名属性,则从 a 中删除这个属性
function subtract(a, b) {
for (let i in b) {
delete a[i];
}
return a;
}
值得注意的是,如果 a 中没有某个 b 的属性, 删除是不会报错的。
四、得到两个对象中共有的属性
返回一个新对象,这个对象包含了 a 和 b 共有的属性。且 b 中的属性值被忽略。
function intersection(a, b) {
retrun restrict(extend({}, a), b); // 这里直接引用上面的方法进行使用
}
以上几个函数的思路和方法都很简单,类似的需求,只要多动脑,都可以想出来的!