js Object.assign()函数以及深、浅拷贝

JavaScript012

js Object.assign()函数以及深、浅拷贝,第1张

object.assign():用于将源对象(source)中可枚举的属性复制到目标属性(target)中,并返回目标对象。

let a={a:1}let b={b:2}let c={c:3}

console.log(Object.assign(a,b,c))

//{ a: 1, b: 2, c: 3 }

浅拷贝:也叫引用拷贝,公用一块内存地址,一个改变另一个也改变;

深拷贝:创建新的内存地址保存值,与原对象完全独立。

深拷贝和浅拷贝只针对复杂的复杂的对象有差别;

注意:针对object.assign()而言,如果属性值是简单类型(number,string),通过object.assign({},src)得到的新对象是深拷贝对象;如果属性值为对象或其他引用类型,得到的新对象为浅拷贝对象。

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,它将返回目标对象。

实际问题中我是做了map处理,变成返回多个obj,所以想着如何合并多个object

但最后发现,其实直接定义个全局 params ,然后在map方法里依次加到 params 里就好了.就不用考虑合并多个obj了

故上面的Object.assign 套用例子可以是

在JS中拷贝、复制一个对象的方式有多种,我常用的一般是 Object.assign({},sourceObj)。

Object.assign()因为 Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。如果合并的对象是多层嵌套对象那就属于浅拷贝了,修改内层对象的值还是会影响原对象。

要想实现深度复制可以使用JSON方式。

写法如下:

它的原理是把JS对象转换为JSON字符串,再由JSON字符串转换为JS对象,这样新对象的指针就不会指向原对象的指针了。但这种也有副作用的,有一下几点副作用:

1、有属性包含时间对象,拷贝后就是字符串的形式。

2、有函数或undefined,拷贝后会丢失。

3、有RegExp和Error对象,拷贝后变为空对象。

4、存在循环引用的情况,没法正确拷贝。

5、内层对象是构造函数生成的,会丢失constructor。

6、属性值为NaN、Infinity,拷贝后变为null。

虽然有些副作用,但大多情况还是符合要求可以使用。