• 1156阅读
  • 1回复

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

楼层直达
5`-UMz<]  
1.Object.assign()基本用法: o 3N]`xD'  
qlsQ|/'D  
Gy"%R-j7  
Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。 ?&X6:KJQ  
7G9 3,dJ  
@T:fa J5\'  
let targetObj1 = { a: 1 }; KE}H&1PjU  
        let sourceObj1 = { b: 1 }; aeP[+I9  
        let sourceObj11 = { c: 3 }; x,8<tSW)Z  
        Object.assign(targetObj1, sourceObj1, sourceObj11); edvFQ#,d  
        console.log(targetObj1); h#qN+qt}  
注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 p_2pU)%  
 jz'<  
H(-4:BD?  
let targetObj1 = { a: 1, b: 2 }; u\1>gDI)|  
        let sourceObj1 = { b: 1 }; {Wv% zA*8  
        let sourceObj11 = { c: 3 }; 60}! LmL  
        Object.assign(targetObj1, sourceObj1, sourceObj11); < <Y}~N  
        console.log(targetObj1); 0Scm? l3  
如果只有一个参数,Object.assign会直接返回该参数。 / T c=  
h7yqk4'Lq  
"Fnq>iR-  
let targetObj1 = { a: 4 } sZhM a>  
        Object.assign(targetObj1); }-DE`c  
        console.log(targetObj1) iL]'y\?lv  
如果该参数不是对象,则会先转成对象,然后返回。 a|_p,_  
D'_Bz8H!p  
@f1*eo5f  
console.log(typeof (Object.assign(2))); K@u&(}  
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。 kc$)^E7  
u0o'K9.r  
)9v`f9X){  
console.log(typeof(Object.assign(null))); pyZ9OA!PD  
xJwG=$o  
console.log(typeof(Object.assign(underfind))); =!b6FjsiG  
注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。 p9qKLJ*.C  
},@^0UH4c  
LM)`CELsYc  
Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。 d 8o53a]  
7 s Fz?` -  
FjFMR 63  
let obj1 = Object.assign({ dwb: 'zjl' }, 3l1cyPv  
)R2XU  
Object.defineProperty({}, 'zmf', { LT@OWH  
3Q By\1h.  
enumerable: false, r[txlQI9  
;_?MX/w|&  
value: 'zmf' {b)~V3rsY  
</"4 zD|  
}) LnsD  
Vb|#MNf)  
) )?aaBaN$  
CE%_A[a  
console.log(obj1); /JJw 6[ N  
aelO3'UN  
let obj2 = Object.assign({ dwb: 'zjl' }, e}yX_Z'P<  
!#yq@2QX  
Object.defineProperty({}, 'zmf', { c64v,Hj9  
,IHb+K  
enumerable: true, ,*svtw:2')  
zaimGMJ ,  
value: 'zmf' G"SBYU  
8wZf ]_  
}) Wp0 Dq(  
D=r))  
) mpw~hW0-  
,)FdRRj  
console.log(obj2); +A8j@d#:  
b=;nm#cAI  
对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。 =aG xg57  
_BM4>r?\  
`~BZ1)@  
var target = { a: { b: 'c', d: 'e' } } MCTsi:V>+  
An`3Ex[  
var source = { a: { b: 'hello' } } ~x:DXEV,  
kOL'|GgK  
Object.assign(target, source); b~m2tC=AW  
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。 nY%5cJ`"  
J([s5:.[  
UUe#{6Jx_  
'jg3  
hT g<*  
v`PY>c6~  
注意,Object.assign可以用来处理数组,但是会把数组视为对象。 vGy8Qu>  
,m3e?j@;r  
Z.PBu|Kx  
console.log(Object.assign([1, 2, 3], [4, 5])); .Ajzr8P  
其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。 23F/\2MSG  
lSwcL  
uQ1@b-e`5  
fwR_OB: $  
)cJ#-M2  
d3Mva,bw<  
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。 7[#yu2  
XOP"Px@  
Z8O n%Mx{"  
var object1 = { a: { b: 1 } }; YwEpy(}hJm  
NpP')m!`}  
var object2 = Object.assign({}, object1); */qtzt  
Jju#iwb  
object1.a.b = 2; y046:@v(  
pKUP2m`MW  
console.log(object2.a.b); !^oV #  
2.用途 9A'Y4Kg<C  
tRb] 7 z  
friWW ^  
2.1为对象添加属性 C4$:mJ>y  
eV^d6T$  
:M3oUE{  
s ^Nw%KAv  
2.2为对象添加方法 D/ybFk  
7cDU2l  
'dG%oDHX]P  
LW6ZAETyL  
2.3克隆对象 9pn>-1NJ  
function copyFnc(origin) { 2F{hg%  
df}r% i  
return Object.assign({}, origin) DTRJ/ @t  
_ gj&$zP  
} ^2D1`,|N  
1/+C5Bp*  
var sur = { a: 1, b: 2 }; *|.0Myjo  
"I6P=]|b  
console.log(copyFnc(sur)); >SF Uy\3  
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 S0,R_d')  
}Db[ 4  
$@-P5WcRs  
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 Cwa^"r3P1  
s8"8y`u  
3f.b\4 U  
function clone(origin) { C$h<Wt=<  
MM_k ]-7  
let originProto = Object.getPrototypeOf(origin); c,MOv7{x_  
?t&kb7  
return Object.assign(Object.create(originProto), origin); _9 .(a  
Qd_6)M-  
} f"G-  
在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。 \W5O&G-C  
Rk<@?(l!6x  
8`>h}Q$  
!^#jwRpeN  
Yf,K#' h:  
1@48BN8cm'  
2.4 合并多个对象 7w :ef0S  
z /KK)u(q  
VZr>U*J[:  
//多个对象合并到某个对象 Z%zj";C G  
#AkV/1Y  
8H,4kY?Z  
const merge = (target, ...sources) => Object.assign(target, ...sources); tsOrt3   
//多个对象合并到新对象 ?lGG|9J\  
z}QwP~Z  
(tah]Bx  
const merge = (...sources) => Object.assign({}, ...sources); Pt:e!qX)  
2"P 99$"  
GG064zPq7  
~)LH='|h\}  
2.5为属性指定默认值 } "vW4   
Xazo 9J  
{R<Ea @LV+  
const DEFAULTS = { r`y ezbG  
/@ !CKh`  
logLevel: 0, 1d"Z>k:mn  
>2$5eI  
outputFormat: 'html' x5`br.b  
QZp6YSz.4  
}; Mv 544>:  
K%<j=c  
function processContent(options) { _/8FRkx  
W :,4:|3  
let options = Object.assign({}, DEFAULTS, options); K5ZC:Ks  
;h6v@)#GX  
} ,u }XW V  
———————————————— x9/H/'  
版权声明:本文为CSDN博主「想要飞翔的小猪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 $n^ MD_1!  
原文链接:https://blog.csdn.net/dwb123456123456/article/details/83316471
 
只看该作者 安逸沙发  发表于: 2019-10-30
assign函数: 24@^{ }  
qc!xW ,I  
函数原型: {K aN,td9  
3_qdJ<,  
void assign(const_iterator first,const_iterator last); 9rj('F & 1  
_[E\=  
void assign(size_type n,const T& x = T()); p?rK`$U+J  
7{BnXN[  
功能: ='/Z;3jt]x  
L@|#Bbmx  
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。 &>}.RX]t  
\3NS>v[1  
实例: fDuwgY0  
:B#EqeI  
#include <vector> F%6*Df;cSe  
#include <iostream> `ypL]$cW  
V> a*3D  
int main( ) qR,.W/eS8  
{ M|CrBJv+F  
using namespace std; 5 Rz/Ri\c=  
vector<int> v1, v2, v3; |n P_<9[  
vector<int>::iterator iter; $>vy(Y  
e&J3N  
v1.push_back(10); iV)ac\  
v1.push_back(20); 4e%8D`/=M  
v1.push_back(30); HY;oy(  
v1.push_back(40); AF#_nK) @  
v1.push_back(50); =Q?f96T  
v2.push_back(1); D?u`  
v2.push_back(2); X7cWgo66T  
]UUI~sFE  
cout << "v1 = " ; 9G:TW|)L[Q  
for (iter = v1.begin(); iter != v1.end(); iter++) A|vP$zy  
cout << *iter << " "; IlHY%8F{  
cout << endl; *m_93J  
2:J,2=%  
cout << "v2 = "; t!l%/$-  
for (iter = v2.begin(); iter != v2.end(); iter++) 9={N4}<  
cout << *iter << " "; S!j^|!  
cout << endl; u7k|7e=xk  
Fe= "EDh  
v2 = v1; RebTg1vGu  
cout << "v2 = "; G:+16XCra  
for (iter = v2.begin(); iter != v2.end(); iter++) r=csi  
cout << *iter << " "; !P|5#.eC  
cout << endl; )bW5yG!  
1k>naf~O  
v2.assign(v1.begin(), v1.end()); sMi{"`37  
cout << "v2 = "; g37q/nEv  
for (iter = v2.begin(); iter != v2.end(); iter++) vj3isI4lU  
cout << *iter << " "; |QYZRz  
cout << endl; _'JRo%{xGX  
1)U} i ^  
v3.assign(7, 3) ; ,RK3eQ  
cout << "v3 = "; 9y+[o  
for (iter = v3.begin(); iter != v3.end(); iter++) /_OOPt=G  
cout << *iter << " "; ltEF:{mLe#  
cout << endl; w??c1)  
A^pW]r=Xtk  
return 0; Yn 1?#%%  
}
快速回复

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