• 2800阅读
  • 1回复

assign函数的使用方法 ES6 Object.assign()的用法

楼层直达
 nWUau:%  
1.Object.assign()基本用法: ,QLy }=N  
^$<:~qq !  
WL3J>S_  
Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。 w<Iq:3  
~!_UDD  
Gz7,g Y  
let targetObj1 = { a: 1 }; ~u r}6T  
        let sourceObj1 = { b: 1 }; P5'VLnE R{  
        let sourceObj11 = { c: 3 }; =-G4 BQ  
        Object.assign(targetObj1, sourceObj1, sourceObj11); jjg&C9w T  
        console.log(targetObj1); #vTF:r  
注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 ,|w,  
c43&[xP Lz  
Gn<e&|4>i}  
let targetObj1 = { a: 1, b: 2 }; zZS,<Z  
        let sourceObj1 = { b: 1 }; _ sBFs.o  
        let sourceObj11 = { c: 3 }; W;8}`k  
        Object.assign(targetObj1, sourceObj1, sourceObj11); Hlj3z3  
        console.log(targetObj1); ,k m`-6.2?  
如果只有一个参数,Object.assign会直接返回该参数。 KzB9 mMrO  
l{. XhB  
&l W~ot1,  
let targetObj1 = { a: 4 } ak(P<OC-  
        Object.assign(targetObj1); N0fmC*1-  
        console.log(targetObj1) b>| d Q  
如果该参数不是对象,则会先转成对象,然后返回。 B|rf[EI>  
xGX U7w:X  
aMyf|l.  
console.log(typeof (Object.assign(2))); ]$A6krfh|  
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。 +4K'KpFzZ  
{^Q1b.=  
_({K6adb  
console.log(typeof(Object.assign(null))); 9K#U<Q0b'  
.p\<niu7  
console.log(typeof(Object.assign(underfind))); .T7S1C $HP  
注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。 {I QCA-AI  
vce1'aW  
UC?i>HsJrX  
Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。 P\.1w>X  
F0+@FS0   
[214b=  
let obj1 = Object.assign({ dwb: 'zjl' }, <@H=XEn  
ZbLN:g}  
Object.defineProperty({}, 'zmf', { =VDtZSa!$^  
,2^zX]dgM  
enumerable: false, jxA*Gg3cT5  
K7gqF~5x~  
value: 'zmf' #kL4Rm;  
FR1se  
}) @P}!mdH1  
'Lv>!s 7  
) {,b:f  
'Gds?o8  
console.log(obj1); ]h0K*{  
.#$D\cwV  
let obj2 = Object.assign({ dwb: 'zjl' }, a76`"(W  
Ww$ ?X LF  
Object.defineProperty({}, 'zmf', { !aub@wH3  
+~]LvZtI_  
enumerable: true, oN6 '%   
- Ado-'aaS  
value: 'zmf' a)GT\1q  
dY%>C75O  
}) j9Y'HU5"  
SvD^'( x  
) \a}W{e=FNT  
z4 yV1  
console.log(obj2); B&oP0 jS  
96$qH{]Ap  
对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。 9!06R-h  
~)\E&c  
8hx 3pvmk  
var target = { a: { b: 'c', d: 'e' } } ^E3i]Oem  
z1u1%FwOfM  
var source = { a: { b: 'hello' } } (ug^2WG Yq  
*3>$ f.QU  
Object.assign(target, source); J_=42aHO  
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。 ^5yFb=2  
]VU a $$  
LT ZoO9O  
17nONhh  
Bco_\cpt]z  
jml 4YaGZ  
注意,Object.assign可以用来处理数组,但是会把数组视为对象。 p+F{iMC  
~A5MzrvIO2  
| rDv!m  
console.log(Object.assign([1, 2, 3], [4, 5])); pg%'_+$~m  
其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。 8 )w75+&  
x3JX}yCX  
1~HR;cTv=  
Gg3cY{7  
Y0||>LX  
Wy2 pa #Q  
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。 ];.H]TIc6  
nzdJ*C  
BmRk|b  
var object1 = { a: { b: 1 } }; #sOkD  
CCp8,  
var object2 = Object.assign({}, object1); eN/o}<(e  
Q)7iu  
object1.a.b = 2; p#~Dq(Q  
c({V[eGY  
console.log(object2.a.b); yX}riXe  
2.用途 O43emL3  
;$Eg4uX  
l@x/{0  
2.1为对象添加属性 X  8V^  
&TmN^R>  
kvzGI>H:  
o<*H!oyP\  
2.2为对象添加方法 _E[zYSo`  
U*.Wx0QM  
##gq{hgjb$  
J1waiOh  
2.3克隆对象 xwZcO  
function copyFnc(origin) { `u%`N j  
j4v.8;  
return Object.assign({}, origin) !TJCQ[Aa }  
jY>BU&  
} wf4?{H  
dqU bJc]  
var sur = { a: 1, b: 2 }; lx8@;9fLy  
p`@7hf|hm  
console.log(copyFnc(sur)); LTGKs^i4  
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 4ZY0!'be-R  
5&WYL  
C]ev"Am_)  
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 '.jr" 3u  
K3QE>@']  
W'l &rm@  
function clone(origin) { $q_e~+SXT  
`:hEc<_/  
let originProto = Object.getPrototypeOf(origin); C5Fk>[fS  
NA5AR*f'  
return Object.assign(Object.create(originProto), origin); =D<{uovQB  
yi7m!+D3  
} 8!a6)Zeux  
在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。 8cqH0{  
~f/nq/8  
|P{K\;-  
{0J TN%e  
[ugBVnma  
b2x8t7%O  
2.4 合并多个对象 ?.&]4z([  
U#=Q`  
{fi:]|<1h  
//多个对象合并到某个对象 .8[Db1W  
4%h@K(iN  
|Qq_;x]  
const merge = (target, ...sources) => Object.assign(target, ...sources); dW3q  
//多个对象合并到新对象 F8(6P1}E  
l56D?E8  
}"?v=9.G  
const merge = (...sources) => Object.assign({}, ...sources); Iu`B7UOF  
-J?i6BHb  
Etk`>,]Y>y  
ISy\g`d`C  
2.5为属性指定默认值 <^}{sdOyu  
$7q'Be@{  
Xne{:!btw  
const DEFAULTS = { @pueM+(L&  
p s:|YR  
logLevel: 0, ;\yVwur  
2" (vjnfH  
outputFormat: 'html' ejYJOTT{^  
HbWl:yU  
}; B|#*I[4`w@  
Yc+0OBH[  
function processContent(options) { =k]RzeI  
RFyeA. N  
let options = Object.assign({}, DEFAULTS, options); YKbR#DC\  
mgeNH~%m@*  
} ?`?"j<4e  
———————————————— 3rX5haD\  
版权声明:本文为CSDN博主「想要飞翔的小猪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 .%>UA|[~:  
原文链接:https://blog.csdn.net/dwb123456123456/article/details/83316471
只看该作者 安逸沙发  发表于: 2019-10-30
assign函数: Et)j6xz/F  
#CB`7 }jq  
函数原型: yfA h=  
~llw_ w  
void assign(const_iterator first,const_iterator last); xw1n;IO4  
M8FC-zFs  
void assign(size_type n,const T& x = T()); Iw</X}#\  
_w9 :([_  
功能: z"{Ji{>%=  
FWpb5jc)3  
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。 X]Ma:1+  
4Mj cx.21  
实例: 7{u1ynt   
/p[lOg  
#include <vector> Lq5Eu$;r  
#include <iostream> 4jz2x #T  
f`,isy[  
int main( ) 2c8e:Xgv  
{ h#I]gHQK  
using namespace std; f\M;m9{(  
vector<int> v1, v2, v3; sQr |3}I(  
vector<int>::iterator iter; 3Qoa ?*  
'wP\VCL2>  
v1.push_back(10); )\Ay4 d  
v1.push_back(20); OLgW .j:Ag  
v1.push_back(30); AU/L_hg  
v1.push_back(40); d"hW45L  
v1.push_back(50); aYPD4yX"/  
v2.push_back(1); e8ZMB$byP  
v2.push_back(2); n*GsM6Y&  
Lb%Wz*Fa%!  
cout << "v1 = " ; Ju 0  
for (iter = v1.begin(); iter != v1.end(); iter++) /qX=rlQ/n  
cout << *iter << " "; C@Fk  
cout << endl; ;p4|M  
a jyuk@  
cout << "v2 = "; ag\xwS#i5H  
for (iter = v2.begin(); iter != v2.end(); iter++) } :8{z`4H  
cout << *iter << " "; y7)$~R):-  
cout << endl; ES&"zjr$  
nd)bRB  
v2 = v1; */JMPw&  
cout << "v2 = "; |X$O'Gf#n  
for (iter = v2.begin(); iter != v2.end(); iter++) :yTpjC-S]  
cout << *iter << " "; 6!GO{2d"  
cout << endl; _:0  
N4JJA+  
v2.assign(v1.begin(), v1.end()); p#eai  
cout << "v2 = "; QC+K:jL  
for (iter = v2.begin(); iter != v2.end(); iter++) hH|moj]  
cout << *iter << " "; Nhnw'9  
cout << endl; z[q#Dw  
mrgieb%  
v3.assign(7, 3) ; gISG<!+X^  
cout << "v3 = "; Vk>m/"  
for (iter = v3.begin(); iter != v3.end(); iter++) 5A~lu4-q  
cout << *iter << " "; YFF\m{#  
cout << endl; #@#/M)  
QX]~|?q  
return 0; {|;5P.,l  
}
快速回复

限100 字节
安逸网提示:批量上传需要先选择文件,再选择上传
 
认证码:
上一个 下一个