我的摸鱼日记第一天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