• 2887阅读
  • 1回复

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

楼层直达
mw ?{LT  
1.Object.assign()基本用法: PlF!cr7:4  
R|$[U  
Ogd8!'\  
Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。 Pf{`/UlD  
Tt`L(oF  
;FcExg|k  
let targetObj1 = { a: 1 }; Ew>~a8! Fq  
        let sourceObj1 = { b: 1 }; ;v%Q8  
        let sourceObj11 = { c: 3 }; Q6eN+i2 ;  
        Object.assign(targetObj1, sourceObj1, sourceObj11); xnT3^ #-h  
        console.log(targetObj1); &3WkH W   
注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 NP$e-" 1  
yLjV[ qP  
lt{lHat1  
let targetObj1 = { a: 1, b: 2 }; =d}gv6v2S  
        let sourceObj1 = { b: 1 };  V+peO  
        let sourceObj11 = { c: 3 }; s Ke,  
        Object.assign(targetObj1, sourceObj1, sourceObj11); aB=vu=hF  
        console.log(targetObj1); ;I[ht  
如果只有一个参数,Object.assign会直接返回该参数。 :a#F  
D8)O4bh  
P{"  WlJ  
let targetObj1 = { a: 4 } @YEw^J~  
        Object.assign(targetObj1); 8$2l^  
        console.log(targetObj1) 9B qQ^`bu  
如果该参数不是对象,则会先转成对象,然后返回。 dNOX&$/=  
"Q3PC!7X:5  
7k'=Fm6za  
console.log(typeof (Object.assign(2))); hZp=BM"bJ  
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。 H(X+.R,Thp  
&?KPu?9  
70'} f  
console.log(typeof(Object.assign(null))); :hC {5!|  
A6{t%k~F  
console.log(typeof(Object.assign(underfind))); >v^2^$^u  
注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。 4y|xUO:  
h g%@W  
g0^~J2sDd  
Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。 yf `.%  
T^/Gj|N*  
ddUjs8VvJ  
let obj1 = Object.assign({ dwb: 'zjl' }, qR [}EX&3  
J>HLQP  
Object.defineProperty({}, 'zmf', { E[)7tr  
o7_MMeQ4  
enumerable: false, Z]mM  
Nw9-pQ  
value: 'zmf' JLy)}8I  
l|@/?GaH  
}) xZ9}8*Q&:  
9B!im\]O  
) 'k-u9  
eZN3H"H  
console.log(obj1); &xGfkCP.]  
877EKvsiC  
let obj2 = Object.assign({ dwb: 'zjl' }, U}RS*7`  
Ckl7rpY+  
Object.defineProperty({}, 'zmf', { H0D>A<Ue  
:|n>H+Y  
enumerable: true, j,|1y5f  
DJ mQZ+{2  
value: 'zmf' jM3Y|}+  
S1H47<)UF  
}) YmO"EWb  
b2}QoJ@`  
) :"<B@Z  
,IT)zCpaBP  
console.log(obj2); r7Q:l ?F2  
j^aQ>(t(9  
对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。 aV?}+Y{#  
g6@NPQ  
/8$1[[[  
var target = { a: { b: 'c', d: 'e' } } j;AzkReb  
Z+``/Q]>+  
var source = { a: { b: 'hello' } } Y&05 *b"  
XftJ=  *  
Object.assign(target, source); S,"ChR  
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。 llZ"uTK\M  
];b!*Z  
;GSFQ:m[  
Xg!|F[i  
g]iy-,e  
e@2Vn? 5  
注意,Object.assign可以用来处理数组,但是会把数组视为对象。 E!}-qbH^  
e}Af"LI  
ILr6W@o5A  
console.log(Object.assign([1, 2, 3], [4, 5])); %\{?(baOA  
其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。 qT<qu(V:  
*Xt c`XH  
FvI0 J  
E]eqvTNH  
G|G?h  
R:IS4AaS  
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。 }b ]y 0"  
g 2 { ?EP  
x+:,b~Skk  
var object1 = { a: { b: 1 } }; _~S^#ut+  
a9EI7pnq  
var object2 = Object.assign({}, object1); E=_B@VJknW  
`E0.PV  
object1.a.b = 2; OD/P*CQ_  
% K7EF_%  
console.log(object2.a.b); dR, NC-*  
2.用途 NF\^'W@N  
F']%q 0  
FZ.z'3I  
2.1为对象添加属性 =jv$ 1  
>Hzb0N!VJ  
}}bi#G:R+  
7 }MJK)  
2.2为对象添加方法 |e; z"-3  
Sfa m=.l  
(Rg!km%2T  
1;~1U9V  
2.3克隆对象 ,~?A. 5  
function copyFnc(origin) { j72] _G  
|afK"N  
return Object.assign({}, origin) M "P  
IoHkcP[H  
} DCzPm/#b  
Vyq<T(5  
var sur = { a: 1, b: 2 }; Xg3[v3m|  
@`8 B} C  
console.log(copyFnc(sur)); q]%bd[zkz  
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 Fj('l  
L[r0UXYLV  
>!F,y3"5S  
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 ZBq*<VtV  
LtWU"42  
C|@k+^S  
function clone(origin) { !!O{ ppM  
2.2a2.I1  
let originProto = Object.getPrototypeOf(origin); :bDn.`KG#  
m$qC 8z]  
return Object.assign(Object.create(originProto), origin); ER0#$yFpM  
"UnSZ[;t  
} je3n'^m  
在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。 `0sk2fn  
% peb{i  
,O{ 5   
U)]natB  
uCS  
3Dvk oV  
2.4 合并多个对象 Ayt!a+J  
$KHDS:&  
(kOv  
//多个对象合并到某个对象 () ;7+  
Gn4b\y%%  
j/|qge4  
const merge = (target, ...sources) => Object.assign(target, ...sources); 9GaER+d|  
//多个对象合并到新对象 :]hfmWC   
q0Pu6"^  
l= S_#  
const merge = (...sources) => Object.assign({}, ...sources); dsuW4 ^ l  
JdEb_c3S  
OAOmd 4  
)\G#[Pc7  
2.5为属性指定默认值 bYH_U4b  
5L#M7E  
a9Rh  
const DEFAULTS = { 8!Kfe  
b1!%xdy_T  
logLevel: 0, O0RQ}~$'m  
| 'G$}]H  
outputFormat: 'html' Mla,"~4D5  
 ^k=[P  
}; ly+7klQ;.  
c7_b^7h1  
function processContent(options) { _`58G#z  
P) #rvTDRw  
let options = Object.assign({}, DEFAULTS, options); `h#JDcT;a  
nor`w,2VF  
} V6N#%(?3  
———————————————— SZEr  
版权声明:本文为CSDN博主「想要飞翔的小猪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 WObfHAp.  
原文链接:https://blog.csdn.net/dwb123456123456/article/details/83316471
只看该作者 安逸沙发  发表于: 2019-10-30
assign函数: -{7:^K[)  
2"BlV *\lS  
函数原型: $?*+P``  
Xk7zXah  
void assign(const_iterator first,const_iterator last); u6(7#n02  
;=C^l  
void assign(size_type n,const T& x = T()); ^e&,<+qY  
jj.]R+.G  
功能: 9F,jvCM63  
R^PQ`$W 'R  
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。 @XmMD6{<  
Y~Jq!  
实例: gO$!_!@LM  
`bH Eu"(,  
#include <vector> }bB_[+YV`{  
#include <iostream> #p_ ~L4iW  
F,lQj7  
int main( ) W?6RUyMC$T  
{ <m)@~s?D  
using namespace std; i 5_g z>  
vector<int> v1, v2, v3; u9GQ)`7Z@  
vector<int>::iterator iter; -><?q t  
<X;y 4lPZ  
v1.push_back(10); Ad`; O+/;  
v1.push_back(20); 8E$KR:/:4  
v1.push_back(30); !5{t1 oJ  
v1.push_back(40); `qr[0wM  
v1.push_back(50); -4V1s;QUZ  
v2.push_back(1); SM@1<OCc  
v2.push_back(2); .}z&$:U9[  
M6g!bK2l  
cout << "v1 = " ; O'j;"l~H|  
for (iter = v1.begin(); iter != v1.end(); iter++) tq1h1  
cout << *iter << " "; 1?mQ fW@G  
cout << endl; R%b,RH#  
Q=>@:1=  
cout << "v2 = "; YK_a37E{F  
for (iter = v2.begin(); iter != v2.end(); iter++) tn:9  
cout << *iter << " "; ^i@tOtS  
cout << endl; ,qaIdw[  
y"P$:l  
v2 = v1; Xhi9\wteYw  
cout << "v2 = ";  ;m7$U  
for (iter = v2.begin(); iter != v2.end(); iter++) |J~;yO SD  
cout << *iter << " "; 8m-ryr)  
cout << endl; J]Uki*s  
lSQANC'  
v2.assign(v1.begin(), v1.end()); M~P}80I  
cout << "v2 = "; Z7OWpujCvN  
for (iter = v2.begin(); iter != v2.end(); iter++) y{5ZC~Z<!  
cout << *iter << " "; =>/aM7]  
cout << endl; >fQ-( io  
I gA0RY1  
v3.assign(7, 3) ; D4;V8(w=#  
cout << "v3 = "; mu|#(u  
for (iter = v3.begin(); iter != v3.end(); iter++) W=]QTx,J  
cout << *iter << " "; jjEkz 5  
cout << endl; =f=MtH?0y  
zziujs:  
return 0; vU&gFEWg  
}
快速回复

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