FE-DSHUI / DSHUI

前端王者小分队读书会
4 stars 1 forks source link

《零食:浅复制方法Object.assign》-2021-2-20 #47

Open AwakenedSomeone opened 3 years ago

AwakenedSomeone commented 3 years ago

在学习对象这一章的时候,发现自己之前对assign这个方法的认识有错误。现记下来,加深印象。

  1. 首先,这个方法的参数情况,第一个参数为目标参数。后面的参数称为源对象,可以有多个。如果只是传第一个参数,则传入的对象和生成的对象是同一个引用,则不能达到复制的效果,两个对象会相互影响。这样的操作就是直接给另一个对象赋值是一样的。 image

  2. 如果生成的对象和目标对象不是相互影响,或者说从表面上看起来不是互相影响,那就将第一个参数传一个{},然后将想复制的对象当作源对象传入第二个参数,此时则不会影响了。 image 3.注意,使用Object.assign方法时,源对象的属性上的一些属性如“writable”,是不会被复制到目标对象的。

  3. 在了解assign的实现过程时,发现其内部是先用Object(target)对传入的目标对象进行了处理,这个地方表明即使传入的是字符串,也会将它转为对象。比如Object('aaa')和new String('aaa')的结果是一样的。并且const a = new Object(obj)这样的写法,得到的对象和obj是同一个引用,所以修改obj的属性,a的属性也会改变。

扩展:说到对象的一些特殊属性,还有一个不常用,却容易记错的一个知识点,就是如果给一个对象的属性的configurable设置为false,表示不能配置,但是如果此时writable是true,则可以通过Object.defineProperty设置为false,但是如果为false,则不能设置为true了。