简介在开发过程中,我们经常会看到Object.assign或者ObjectSpread,这两种方法都可以帮助你得到想要的对象。有人喜欢用Object.assign,有人喜欢用ObjectSpread,到底哪个好呢?本文就是探讨这个问题。Object.assign和ObjectSpread这两个常用函数可以实现对象自身属性(包括Symbol属性)的拷贝。示例创建MyClassclassBaseClass{foo(){return1;}}classMyClassextendsBaseClass{bar(){return2;}}constobj=newMyClass();obj.baz=function(){返回3;};obj1[Symbol.for('test')]=4;使用ObjectSpreadconstclone1={...obj1};控制台日志(克隆1);//{baz:[Function],[Symbol(test)]:4}console.log(clone1.constructor.name);//对象console.log(clone1instanceofMyClassTwo);//false使用Object.assignconstclone2=Object.assign({},obj1)console.log(clone2);//{baz:[Function],[Symbol(test)]:4}console.log(clone2.constructor.name);//对象console.log(clone2instanceofMyClassTwo);//falsesummary没有把MyClass或者BaseClass的属性赋值给新的对象,说明只复制对象自身的属性(包括Symbol属性)。Object.assign和ObjectSpread的区别在于Object.assign会触发对象的setter,而ObjectSpread不会触发目标对象的setter:classMyClassOne{setname(value){console.log('setname:',价值);}}constobj=newMyClassOne();Object.assign(obj,{name:'hahah'});//打印"setname:haha??h"constnewObj={...obj,{name:'hahah'}}//是否**不**打印触发器Object.prototypesetters:Object.defineProperty(Object.prototype,'myProp',{set:()=>console.log('Settercalled');});constobj={myProp:42};Object.assign({},obj);//打印“Settercalled”constnewObj={..obj};//Does**not**print"Settercalled"而不是实现Object.assign({},obj)isequalto{...obj}兼容性比较总结因为Object.assign修改了原对象,所以会触发原始对象的设置器。而ObjectSpread只是做了一个浅拷贝,不会触发setter。综上所述,这两个方法都是ECMAScript标准的方法,可以放心使用。Object.assign的兼容性会好一些,ObjectSpread的兼容性也不错。在兼容性好办的今天,为了避免不小心触发setter,全部使用ObjectSpread`是更好的选择。参考https://thecodebarbarian.com/...https://cloud.tencent.com/dev...
