浅谈Object.assign()

160 阅读3分钟

我的摸鱼日记第一天Start

1.Object.assign()它的作用

1.Object.assign(a,b,c)-->将参数拷贝到目标对象中,并返回目标对象(简答来说就是合并克隆)

2.使用的方法和注意点

1.可以传递多个参数,例如:Object.assign(a,b,c),第一个参数代表目标对象,后面的代表源对象,他们都会合并到目标对象上.

let zz=Object.assign({})//只有一个参数时候,传递空对象返回就是空对象{}

2.Object.assign()的第一个参数应该是一个对象,如果不是对象,内部会自动转化成对象,如果碰到不能转化的,或者转化后为null或undefined的assign就会报错

let zz=Object.assign(null,{a:1})//结果就是报错

3.Object.assign()不会合并继承属性和不可枚举属性-->(数字(number),布尔型(boolean)) 字符串类型则会被分割,字符按下标作为属性值存储

let x=1
let z=true
let str='abc'
console.log(zz,'克隆');//{0:a,1:b,2:c}

4.简单类型和普通的对象(只有一层的对象)则是深拷贝(前面的变量值发生改变,但是我们合并后的目标对象值不会跟 着改变)

let str='abc'
let obj={a:1}
let zz=Object.assign({},str,obj)
console.log(zz,'克隆');//更新前:{0:a,1:b,2:c,a:1}
str='def'
obj.a=8
console.log(zz,'克隆22');//更新后:{0:a,1:b,2:c,a:1}

5.源对象内容如果后面的和前面的相同则会产生覆盖效应,以后面的内容为最新内容

let obj={a:1}
let obj2={b:1}
let obj4={a:8}
let zz=Object.assign({},obj,obj2,obj4)
 console.log(zz,'克隆');//{a:8,b:1}

6.如果源对象是复合类型对象,就是多层对象-->{a:{b:{c:1}}},那么它就是浅拷贝(前面的变量值发生改变会影响合并后的目标对象的值)

let obj3={c:{d:{e:8}}}
let zz=Object.assign({},obj3)
console.log(zz,'克隆');//更新前 {c:{d:{e:8}}}
obj3.c.d.e=5
console.log(zz,'克隆22');//更新后 {c:{d:{e:5}}}

7.那么如何针对多层对象的情况实现深拷贝呢?解答:通过JSON.stringify把对象变成字符串,再通过JSON.parse()来变成新对象,使引用地址发生改变,即可实现深拷贝.如果对象中包含 function 或 RegExp 这些就不能用这种方法了

let obj3={c:{d:{e:8}}}
let zz=Object.assign({},JSON.parse(JSON.stringify(obj3)))
console.log(zz,'克隆');//更新前 {c:{d:{e:8}}}
obj3.c.d.e=5
console.log(zz,'克隆22');//更新后 {c:{d:{e:8}}}

8.如果源对象是数组的话,那么数组的下标就是键名,数组元素为键值,如果多个数组合并的话,下标相同的也会有覆盖效应

let arr=[1,2]
let arr2=[4,5,6]
let zz=Object.assign({},arr,arr2)
console.log(zz,'克隆');//{0:4,1:5,2:6}

9.如何源对象的属性是一个get函数(也叫取值函数)那么优先进行值计算,拿到返回值,在进行克隆属性

let fn={
            get fn01(){
                return 123
            }
        }
let zz=Object.assign({},fn)
console.log(zz,'克隆');//{fn01:123}

我的摸鱼日记第一天END