• 2859阅读
  • 1回复

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

楼层直达
7(8  
1.Object.assign()基本用法: ,beR:60)  
fC GDL6E  
mUyv+n,  
Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。 8N* -2/P&  
&tz%WW%D8  
8^/Ek<Q b|  
let targetObj1 = { a: 1 }; |@L &yg,x  
        let sourceObj1 = { b: 1 }; Ed&,[rC  
        let sourceObj11 = { c: 3 }; HvgK_'  
        Object.assign(targetObj1, sourceObj1, sourceObj11); #D LT-G0  
        console.log(targetObj1); yp2'KES>  
注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 />^`*e_  
z@l!\m-  
\LoSUl i  
let targetObj1 = { a: 1, b: 2 }; a[P>SqT4`  
        let sourceObj1 = { b: 1 }; G9'YgW+$7  
        let sourceObj11 = { c: 3 }; w] 5U  
        Object.assign(targetObj1, sourceObj1, sourceObj11); MY?O/,6  
        console.log(targetObj1); |+;KhC  
如果只有一个参数,Object.assign会直接返回该参数。 ]IHD:!Z-=  
7\0|`{|R@  
cGpN4|*rQ  
let targetObj1 = { a: 4 } Ic{'H2~4,  
        Object.assign(targetObj1); ."F'5eTT~  
        console.log(targetObj1) k;K> ,$ F  
如果该参数不是对象,则会先转成对象,然后返回。 C6D=>%uY  
0+n&BkS'  
:_fjml/  
console.log(typeof (Object.assign(2))); n $O.>  
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。 "u Of~e"  
wv7p,9Z[  
_>jrlIfc  
console.log(typeof(Object.assign(null))); [$1: &!(!  
je- , S>U  
console.log(typeof(Object.assign(underfind))); Cz=A{< ^g  
注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。 Qr|N)  
8m/FKO (r  
zJnL<Q  
Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。 xUiWiOihr6  
>0Fxyv8  
! F0rd9  
let obj1 = Object.assign({ dwb: 'zjl' }, Aj8l%'h[  
K;<NBnH  
Object.defineProperty({}, 'zmf', { ?r -\%_J_(  
{\vI9cni|"  
enumerable: false, 9]]!8_0=r  
x !#Ma  
value: 'zmf' .DgoOo%?"  
wFK:Dp_^  
}) ;yk9(wea}"  
y;,=a jrF  
) 8yHq7=  
a(PjcQ4dY  
console.log(obj1); bWGyLo,  
>|l;*Kw,/P  
let obj2 = Object.assign({ dwb: 'zjl' }, > ]>0KQfO  
9 b?i G  
Object.defineProperty({}, 'zmf', { e(?:g@]-r  
BhqhyX\D&y  
enumerable: true, z[WC7hvU  
?F!EB4E\y}  
value: 'zmf' E"Zb};}  
[yO=S0 e  
}) x^zdTMNhw  
;l$9gD>R  
) Bx+d3  
(F/HU"C  
console.log(obj2); >NJjS8f5  
7 rH'1U  
对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。 1#/6r :  
@XeEpDn]  
DLU[<! C  
var target = { a: { b: 'c', d: 'e' } } Ud$Q0m&  
pfR"s:#  
var source = { a: { b: 'hello' } } +Dd"41  
6*sw,sU[y  
Object.assign(target, source); FQ U\0<5  
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。 oL#xDG  
j H(&oV  
`ovgWv  
}X.>4\B5  
z* RSMfRW  
o/WC@!wg K  
注意,Object.assign可以用来处理数组,但是会把数组视为对象。 R0vww_fz  
!5&%\NSv  
MO-!TZ+6  
console.log(Object.assign([1, 2, 3], [4, 5])); aV<^IxE;  
其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。 "NKf0F  
j AQU~Ol_  
eHUg-\dy  
7D   
7lR<@$q  
+TF8WZZF.d  
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。 9#Bx]wy  
Pxqiv9D<R  
HxZ.OZbR  
var object1 = { a: { b: 1 } }; c" +zgP  
v,jhE9_O0  
var object2 = Object.assign({}, object1); Oc~aW3*A(  
w12}Rn8  
object1.a.b = 2; '_ 0  
SO3cY#i z"  
console.log(object2.a.b); :6D0j  
2.用途 /H)Br~ l  
DsGI/c  
g<a<*)&  
2.1为对象添加属性 7"cv|6y|  
o @KW/RN"  
 iSiDSeW8  
Qqq <e  
2.2为对象添加方法 Qx t@ V  
:1;Q(9:v  
p/*"4-S  
mCdgKr|n  
2.3克隆对象 BJ5}GX!  
function copyFnc(origin) { @Y-TOCadT  
l r~gG3   
return Object.assign({}, origin) Wi$dZOcSJ  
_Y!sVJ){,c  
} &=Y e6 f[  
F,T~\gO5,  
var sur = { a: 1, b: 2 }; ?KP}#>Ba@  
 CdZ BG  
console.log(copyFnc(sur)); | vu>;*K  
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 YI@Fhr &NU  
o2uj =Gnx  
k;Fh4Hv  
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 '{[),*nCn  
YQ]\uT>}&  
uaw <  
function clone(origin) { -iN.Iuc{b_  
io%')0p5q  
let originProto = Object.getPrototypeOf(origin); Q0cRH"!:  
XL5Es:"+?S  
return Object.assign(Object.create(originProto), origin); uT_!'l$fr  
q/gB<p9  
} >e&:`2%.  
在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。 p>*i$  
C)RBkcb  
acW'$@y9?N  
=o=1"o[  
}1H=wg>\  
Ufid%T'  
2.4 合并多个对象 =VP=|g  
/^7iZ|>:M:  
x"4%(xBu  
//多个对象合并到某个对象 2>PH 8  
XvGA|Ekf<  
kBEmmgL  
const merge = (target, ...sources) => Object.assign(target, ...sources); 9w4sSj`  
//多个对象合并到新对象 3I=kr  
W{"XJt_  
x4K`]Fvhl  
const merge = (...sources) => Object.assign({}, ...sources); nBLj [  
A.%CAGU5w  
;h/pnmhP  
\FzM4-  
2.5为属性指定默认值 r.3KPiYK  
gUax'^w;V;  
r0dDHj~F  
const DEFAULTS = { c+' =hR[  
e 9$C#D> D  
logLevel: 0, le>Wm&E  
df*w>xS  
outputFormat: 'html' +Ezgn/bS&  
TYgQJW?  
}; '` CspY  
Wsj=!Obc  
function processContent(options) { = bt]JRU  
p='-\M74K  
let options = Object.assign({}, DEFAULTS, options); wo^Sy41bF  
/\d$/~BFi  
} S[:xqzyDg  
———————————————— q }C+tn"\  
版权声明:本文为CSDN博主「想要飞翔的小猪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 |FR3w0o  
原文链接:https://blog.csdn.net/dwb123456123456/article/details/83316471
只看该作者 安逸沙发  发表于: 2019-10-30
assign函数: !}KqB8;  
|J0Q,F]T  
函数原型: AoaN22  
%ZP+zh n}  
void assign(const_iterator first,const_iterator last); _qXa=|}V.  
~8T(>!hE1h  
void assign(size_type n,const T& x = T()); jJZgK$5+  
*e#<n_%R  
功能: }/P5>F<H[  
zTbVp8\pI  
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。 <M]h{BS=  
U-k VNBs  
实例: @4$\ 5 %j  
J?UQJ&!@O  
#include <vector> !R-z%  
#include <iostream> !QI\Fz?  
W1B)]IHc  
int main( ) vIl+#9L0  
{ 0 [?ny`Y  
using namespace std; *'Y@3vKE  
vector<int> v1, v2, v3; h:zK(;  
vector<int>::iterator iter; !o=U19)  
zk*c)s  
v1.push_back(10); h_1T,f (  
v1.push_back(20); g,o?q:FL  
v1.push_back(30); iRg7*MQu  
v1.push_back(40); %>-@K|:gS  
v1.push_back(50); r78TE@d  
v2.push_back(1); x8\A<(G_M=  
v2.push_back(2); 2aJS{[  
3d<HN6&U  
cout << "v1 = " ; %sHF-n5P  
for (iter = v1.begin(); iter != v1.end(); iter++) ?bM_q_5  
cout << *iter << " "; Mu'8;9_6  
cout << endl; V=fEPM  
b'6- dU%  
cout << "v2 = "; Og=*R6i  
for (iter = v2.begin(); iter != v2.end(); iter++) btdb%Q*  
cout << *iter << " "; >``MR%E:<  
cout << endl; 6JKqn~0Kk  
hXqD<?  
v2 = v1; r5!/[_l  
cout << "v2 = "; JyR/1 W  
for (iter = v2.begin(); iter != v2.end(); iter++) x\Z'2?u}  
cout << *iter << " "; 5]M>8ll  
cout << endl; uYE`"/h,1e  
B'^:'uG  
v2.assign(v1.begin(), v1.end()); tK&' <tZh  
cout << "v2 = "; rXA*NeA3v  
for (iter = v2.begin(); iter != v2.end(); iter++) 7O, U?p  
cout << *iter << " "; 271&i  
cout << endl; >Wz;ySEz  
,_"AT! r  
v3.assign(7, 3) ; ar:+;.n  
cout << "v3 = "; WJ_IuX51'  
for (iter = v3.begin(); iter != v3.end(); iter++) JGuN:c$  
cout << *iter << " "; _Gu- uuy  
cout << endl; n_'s=]~  
IEU^#=n  
return 0; W^G>cC8.L  
}
快速回复

限100 字节
安逸网提示:如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
认证码:
上一个 下一个