• 2829阅读
  • 1回复

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

楼层直达
c%+_~iBUN  
1.Object.assign()基本用法: 5Ic'6AIz  
~Fe$/*v  
0'g e}2^  
Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。 Q$*JkwPQ}  
QPyHos `  
r [E4/?_  
let targetObj1 = { a: 1 }; XOoz.GSQ  
        let sourceObj1 = { b: 1 }; R xA:>yOPn  
        let sourceObj11 = { c: 3 }; VZ]}9k  
        Object.assign(targetObj1, sourceObj1, sourceObj11); `uof\D<']  
        console.log(targetObj1); ANRZQpnXQ  
注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 )eVn1U2*z.  
XE$;Z'Qhjm  
^Z+p_;J$p  
let targetObj1 = { a: 1, b: 2 }; jfU$qo!gi  
        let sourceObj1 = { b: 1 }; "uP~hFA7M  
        let sourceObj11 = { c: 3 }; 13p.dp`  
        Object.assign(targetObj1, sourceObj1, sourceObj11); AbL(F#{  
        console.log(targetObj1); %RIlu[J  
如果只有一个参数,Object.assign会直接返回该参数。 ~IFafAO&  
o0_H(j?  
ul{D)zm\D  
let targetObj1 = { a: 4 } D^S"6v" z  
        Object.assign(targetObj1); kvN<o-B  
        console.log(targetObj1) xD9ZL  
如果该参数不是对象,则会先转成对象,然后返回。 >@EwfM4[e  
j>3Fwg9V  
5O~;^0iC  
console.log(typeof (Object.assign(2))); D7Y?$=0ycb  
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。 =N2@H5+7  
Gh}* <X;N  
_TyQC1 d  
console.log(typeof(Object.assign(null))); bYYjP.rcF  
(`<B#D;  
console.log(typeof(Object.assign(underfind))); Ch]q:o4  
注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。 }OSfC~5P  
Ls*Vz,3!5  
'.e 5Ku  
Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。 <)+;Bg  
&VxK AQMxN  
:(I=z6  
let obj1 = Object.assign({ dwb: 'zjl' }, eTt{wn;6  
R=W$3Ue~,  
Object.defineProperty({}, 'zmf', { vIFx'S~D  
ktv{-WG2_  
enumerable: false, pe+m%;nzR  
efh1-3f  
value: 'zmf' 5hB2:$C  
7.C]ZcU  
}) V{0V/Nv  
Kw>gg  
) ;~s@_}&  
<pUc( tPoz  
console.log(obj1); 98WJ"f_ #  
yAc}4*;T/  
let obj2 = Object.assign({ dwb: 'zjl' }, Rh7=,=u  
T0}P 'q  
Object.defineProperty({}, 'zmf', { j0jam:.p  
*Xd_=@L&B  
enumerable: true, . LNqU#a  
1'* {Vm M  
value: 'zmf' vGPaWYV  
ZZ6F0FLXJ  
}) YJwz*@l  
0b}lwo,|\  
) /h%MWCZWm^  
h-h}NCP  
console.log(obj2); 1')/BM2  
'lNl><e-  
对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。 B[MZ Pv)  
z*>CP  
O"9f^y*  
var target = { a: { b: 'c', d: 'e' } } 5cQBqH]  
Vt4}!b(O  
var source = { a: { b: 'hello' } } V2]S{!p}k  
I.e'  
Object.assign(target, source); iVu+ct-iv  
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。 J0p,P.G  
Azz]TO  
,em6wIq,  
X7c*T /  
= xX^  
EJtU(HmW  
注意,Object.assign可以用来处理数组,但是会把数组视为对象。 JN KZ'9  
M<~F>(wxA  
Gj_b GqF8}  
console.log(Object.assign([1, 2, 3], [4, 5])); ,m b3H  
其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。 !Z'm@,+  
:A{-^qd(  
N8{>M,  
t@HE.h  
XbOL/6V ^[  
9,c>H6R7  
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。 NR[mzJv  
&L?Dogo  
)yK!qu  
var object1 = { a: { b: 1 } }; W[m_IY  
|#B"j1D,H  
var object2 = Object.assign({}, object1); I(CI')Q  
)AoFd>  
object1.a.b = 2; o|W? a#_\  
wm8x1+P  
console.log(object2.a.b); 1m)/_y~1 k  
2.用途 @i h}x  
%ze1ZWO{  
GXRjR\Ch  
2.1为对象添加属性 [s2V-'2  
gNd J=r4  
 o %%fO  
pQY>  
2.2为对象添加方法 0d ->$gb  
? ^CGJ1  
2&fwr>!$  
jTr 4A-"  
2.3克隆对象 =7Vl{>*1N  
function copyFnc(origin) { cvA\C_  
J\'5CG  
return Object.assign({}, origin) O97bgj]  
p8dn-4  
} Td1ba^J  
O + & xb  
var sur = { a: 1, b: 2 }; `;CU[Ps?]  
XFTMT'9  
console.log(copyFnc(sur)); uO(guA,C  
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 m`IQ+, e  
N"RYM~c7  
B8AzN9v&"N  
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 4F,Ql"ae(  
36x:(-GFq  
}FiN 7#  
function clone(origin) { p_qm}zp  
Jrd4a~XP  
let originProto = Object.getPrototypeOf(origin); V9j1j}  r  
O| J`~Lk  
return Object.assign(Object.create(originProto), origin); aXbNDj ][  
04guud }  
} |1+(Ny.%k  
在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。 bV$8 >[`  
i<wU.JX&h  
e(w/m(!Wny  
*$L z2 ]  
`e?;vA&  
9R@abm,I  
2.4 合并多个对象 IQw %|^  
GL 5^_`n  
uGa(_ut  
//多个对象合并到某个对象 AGEZ8(h  
7~ *;=,mw  
u%=bHg  
const merge = (target, ...sources) => Object.assign(target, ...sources); U+.PuC[3  
//多个对象合并到新对象 c>S"`r  
TZh\#dp4l  
Gg}5$||^C  
const merge = (...sources) => Object.assign({}, ...sources); Nt zq"ces)  
6%ZHP?  
uX<+hG.n}  
ezcS[r  
2.5为属性指定默认值 v9E+(4I9_  
rDIhpT)a  
d[Rb:Y w  
const DEFAULTS = { b A)b`1lI  
<\, & :<  
logLevel: 0, /:#j ?c  
j6n2dMRvSE  
outputFormat: 'html' A#Xj]^-*  
'rS'B.D  
}; L3B8IDq  
`0yb?Nk `:  
function processContent(options) { U:qF/%w  
.=Pm>o/,  
let options = Object.assign({}, DEFAULTS, options); &nQRa?3,   
Dp!;7e s|  
} c`-YIz)W  
———————————————— Qn *6D  
版权声明:本文为CSDN博主「想要飞翔的小猪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 EtGH\?d~]  
原文链接:https://blog.csdn.net/dwb123456123456/article/details/83316471
只看该作者 安逸沙发  发表于: 2019-10-30
assign函数: 4yjAi@ /2  
|RHX2sso  
函数原型: \b~zyt6-  
YIjBKh  
void assign(const_iterator first,const_iterator last); 'gQm%:qU3r  
2{ }5WH  
void assign(size_type n,const T& x = T()); IzkZ^;(N  
Z=n& fsE  
功能: %!LrC!6P4  
:B)w0tVw  
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。 >>K) 4HYID  
W9.Z hpM  
实例: -O. MfI+  
9?l( }S`  
#include <vector> x7t"@Gz  
#include <iostream> ;I]TM#qGF  
'}LH,H:%G  
int main( ) E70  
{ 7{/qQGL  
using namespace std; UV@<55)K  
vector<int> v1, v2, v3; Y~gpiL3u  
vector<int>::iterator iter; ~r&Q\G  
Oj~k1+*  
v1.push_back(10); $F;$-2  
v1.push_back(20); P4Wd=Xoz6  
v1.push_back(30); Ff%m.A8d,4  
v1.push_back(40); ~d){7OG  
v1.push_back(50); Br1JZHgA  
v2.push_back(1); 7s>d/F3*  
v2.push_back(2); 2|w(d  
iTqv=  
cout << "v1 = " ; /.7x[Yc  
for (iter = v1.begin(); iter != v1.end(); iter++) +~8/7V22  
cout << *iter << " "; \ 1ys2BX  
cout << endl; rQN+x|dKMb  
I{B8'n{cN  
cout << "v2 = "; DCP "  
for (iter = v2.begin(); iter != v2.end(); iter++) 2Xe2 %{  
cout << *iter << " "; dpGaI  
cout << endl; c\]h YKA  
93[`1_q7\  
v2 = v1; kf&id/|  
cout << "v2 = "; {lx^57v  
for (iter = v2.begin(); iter != v2.end(); iter++) |Z#) 1K  
cout << *iter << " "; |F9/7 z\5+  
cout << endl; TX*s T  
4)Z78H%>  
v2.assign(v1.begin(), v1.end()); nVs0$?}  
cout << "v2 = "; dwB-WF%k  
for (iter = v2.begin(); iter != v2.end(); iter++) CQ#p2  
cout << *iter << " "; |CStw"Fog  
cout << endl; ]5uCs[  
rf^1%Zo:  
v3.assign(7, 3) ; qo$<&'r  
cout << "v3 = "; 1mf|:2,  
for (iter = v3.begin(); iter != v3.end(); iter++) nJA\P1@m  
cout << *iter << " "; "m/0>UU0  
cout << endl; 2l8jw:=H  
d}ue/hdw  
return 0; 9J0m  
}
快速回复

限100 字节
安逸网提示:如果您在写长篇帖子又不马上发表,建议存为草稿
 
认证码:
上一个 下一个