一、Object.assign()
介绍
1.定义:
Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。 ——MDN
2.语法
Object.assign(target, ...sources)
target:目标对象
sources:源对象,可以任意多个
返回值:一定是对象
二、原理及实现
1.分析特点:
(1)第一个参数不能是null或undefined(不太清楚为什么)
(2)返回值一定是对象,所以不管传入的第一个参数是什么类型(除null或undefined),都用Object()转化成对象
(3)因为可以传多个对象参数,则遍历对目标对象赋值即可。
2.代码:
function myAssign(target, ...sources) {
// 第一个参数不能是null或undefined
if (target === undefined || target === null) {
throw new TypeError('cannot convert first argument to object');
}
// 返回的一定是对象
let res = Object(target);
for (let i = 0; i < sources.length; i++) {
let obj = sources[i];
if (obj !== null && obj !== undefined) {
for (let k in obj) {
if (Object.prototype.hasOwnProperty.call(sources[i], k)) {
res[k] = obj[k];
}
}
}
}
return res;
}
总结:
自己写了一遍之后就知道为什么第一层的属性是深拷贝,对象中的对象就都是浅拷贝了。
其实只是把对象中的属性拿出了赋值给目标对象,但并没有对对象的对象进行遍历赋值处理。