• 2884阅读
  • 1回复

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

楼层直达
H-;&xzAI  
1.Object.assign()基本用法: XKpL4]{&q4  
y|FBYcn#F  
Jslk  
Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。 Wg}B@:`T  
oV%( 37W9=  
?ZSXoy-kr  
let targetObj1 = { a: 1 }; P-/XYZ]`  
        let sourceObj1 = { b: 1 }; U:s} /to  
        let sourceObj11 = { c: 3 }; 3bT6W, J4T  
        Object.assign(targetObj1, sourceObj1, sourceObj11); NqQM! B]  
        console.log(targetObj1); 0A) Vtj$  
注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 v>x {jZkFL  
Q0 uP8I}n  
!=~s/{$PE  
let targetObj1 = { a: 1, b: 2 }; 8`L#1ybMO  
        let sourceObj1 = { b: 1 }; yFPaWW  
        let sourceObj11 = { c: 3 }; xA[Wb'  
        Object.assign(targetObj1, sourceObj1, sourceObj11); +d6Aw}*  
        console.log(targetObj1); O<eWq]  
如果只有一个参数,Object.assign会直接返回该参数。 Zq\RNZ}  
QK``tWLIg7  
LK   
let targetObj1 = { a: 4 } T!^?d5uW#  
        Object.assign(targetObj1);  Gh)sw72  
        console.log(targetObj1) U- *8%>Qp  
如果该参数不是对象,则会先转成对象,然后返回。 D^N#E>,  
+qh< Fj>  
(^s&M  
console.log(typeof (Object.assign(2))); y'0dl "Dy\  
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。 v3hQv)j)  
{LB }v;?l  
90y9~.v  
console.log(typeof(Object.assign(null))); #pDGaqeX  
XRz%KVysp  
console.log(typeof(Object.assign(underfind))); R+kZLOE  
注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。 53,,%Ue  
8~[C'+r  
Y|0-m#1F#  
Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。 ?2;n=&ZM  
eMm~7\ R  
CyK$XDHa  
let obj1 = Object.assign({ dwb: 'zjl' }, {YKMQI^O/  
"$V8y  
Object.defineProperty({}, 'zmf', { n6!Ihip$  
O[hbu![  
enumerable: false, M ly z><  
9+is?Pj  
value: 'zmf' \'LCC-  
z$BnEd.y=:  
}) X+gz+V/  
_ !^FW%  
) Bc|x:#`C\{  
Tx!m6B`Y  
console.log(obj1); &!YH"{b  
'3u]-GU2_  
let obj2 = Object.assign({ dwb: 'zjl' }, rLw[y$2  
4 TQISu)  
Object.defineProperty({}, 'zmf', {   [aS)<^  
NdSxWrD`m  
enumerable: true, +heS\I_Mp  
CG>2 ,pP,  
value: 'zmf' [ 6o:v8&3  
m',_k Y3  
}) @1ta`7#  
Mjvso0zj  
) Y 6Qb_X:  
rnhf(K.{3  
console.log(obj2); YxkEAb!+  
QRHm |f9_C  
对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。 :lQjy@J  
n03SX aU~V  
2P=~3g*  
var target = { a: { b: 'c', d: 'e' } } Jo(}#_y?  
_vLT!y  
var source = { a: { b: 'hello' } } !cq| g  
BBJ]>lQ  
Object.assign(target, source); Odtck9L  
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。 yaYt/?|  
GO3YXO33  
GXK?7S0H  
N,,2 VSUr  
MNmQ%R4jRN  
4H=sD t  
注意,Object.assign可以用来处理数组,但是会把数组视为对象。 _NnO mwK7  
:{uUc  
!jq6cND  
console.log(Object.assign([1, 2, 3], [4, 5])); _-\{kJ  
其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。 WA5kX SdIb  
b}*bgx@<  
&D w~Jq|  
be#"517  
w>Sz^_ h  
!`=?<Fl  
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。  "<h#Z(  
Jz0S2&  
97dI4 t<  
var object1 = { a: { b: 1 } }; s7} )4.vO  
|YFlJ2w  
var object2 = Object.assign({}, object1); NmF2E+'  
ra2q. H  
object1.a.b = 2; O_Q,!&*6  
e'&{KD,-T  
console.log(object2.a.b); \c}r6xOr  
2.用途 .utL/1Ej  
)D*xOajo+l  
iNSJOS  
2.1为对象添加属性 rRel\8  
tH(#nx8  
t%@ pyK  
8:NHPHxB  
2.2为对象添加方法 }3lF;k(2g  
blv6  
Z5A<TC/:  
wf1DvsJQl  
2.3克隆对象 -NeF6  
function copyFnc(origin) { 1| DI'e[X  
\gpKQt0  
return Object.assign({}, origin) g*M3;G  
k$!&3Rh  
} gEu\X|7'  
eSU8/9B  
var sur = { a: 1, b: 2 }; WAbhB A  
v( B4Bz2  
console.log(copyFnc(sur)); 7Wu2gky3  
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 uItKsu  
9HP--Z=  
ZHJzh\?  
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 (x@"Dp=MZW  
Fz% n!d  
1Rh&04O>VL  
function clone(origin) { j3>< J  
p:jrqjLp  
let originProto = Object.getPrototypeOf(origin); mq L+W  
~nQb;Bdh%  
return Object.assign(Object.create(originProto), origin); i]v!o$7  
OZ6%AUot  
} 'zaB5d~l  
在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。 Z6p>R;9n  
>Vvc55z  
1X5\VY>S`h  
dj=n1f+;[  
.o>QBYpTw/  
GCoqKE  
2.4 合并多个对象 w%ForDB>P  
]WG\+1x9  
4{Iz\:G:{/  
//多个对象合并到某个对象  tua+R_"  
Wq4?`{  
W +S>/`N  
const merge = (target, ...sources) => Object.assign(target, ...sources); >g?,BK@  
//多个对象合并到新对象 #E#70vWp\O  
&"BKue~q@p  
|^1eL I  
const merge = (...sources) => Object.assign({}, ...sources); ?$ 3=m)s  
u*M*Wp Y  
 -x7L8Wj  
K46\Rm_:B;  
2.5为属性指定默认值 ISl'g'o  
s:jwwE2  
i_MDLS>-  
const DEFAULTS = { os>|LPv4  
eC1cE  
logLevel: 0, 39OZZaWL  
43/|[  
outputFormat: 'html' z_zr3XR9  
[P[syi#]t  
}; kJ~^  }o  
W nVX)o  
function processContent(options) {  yXDf;`J  
JK_sl>v.7  
let options = Object.assign({}, DEFAULTS, options); GwpJxiFgk  
fx9c1h9s  
} & K7+V  
———————————————— cP(/+ /9  
版权声明:本文为CSDN博主「想要飞翔的小猪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 iLFF "Hs  
原文链接:https://blog.csdn.net/dwb123456123456/article/details/83316471
只看该作者 安逸沙发  发表于: 2019-10-30
assign函数: @'AjEl:&-_  
Q# Yba  
函数原型: '73g~T%$^*  
rGDx9KR4K!  
void assign(const_iterator first,const_iterator last); gfr+`4H>v  
gJFx#s0?6.  
void assign(size_type n,const T& x = T()); nDU=B.?E{O  
GZt L-   
功能: &# < M o  
"h`oT4j5q  
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。 Y n7z#bu  
$*')Sma  
实例: ks|c'XQb  
]#sF pWI[N  
#include <vector> MBn ZO  
#include <iostream> wrhGZ=k{  
[,0[\NC  
int main( ) MHqk-4Mz  
{ UFzC8  
using namespace std; i9+qU  
vector<int> v1, v2, v3;  P y!$r  
vector<int>::iterator iter; Ly P Cc|  
"$#<+H>O  
v1.push_back(10); &V(;zy4(R  
v1.push_back(20); j"r7M|Z+V  
v1.push_back(30); ],-(YPiAD  
v1.push_back(40); N`J]k B7  
v1.push_back(50); mFrDV,V  
v2.push_back(1); 3|Y2BA d  
v2.push_back(2); 'm^]X3y*  
e'A 1%g)  
cout << "v1 = " ; M2Jb<y]  
for (iter = v1.begin(); iter != v1.end(); iter++) 7{lWg x  
cout << *iter << " "; 37 b6w6{D  
cout << endl; 1*f*}M  
6~OJB!  
cout << "v2 = "; -Q6Vz=ku  
for (iter = v2.begin(); iter != v2.end(); iter++) YYhN>d$  
cout << *iter << " "; g(C/J9J  
cout << endl; T3NH8nH9"z  
1i&|}"  
v2 = v1; 22/"0=2g  
cout << "v2 = "; EXsVZg"#  
for (iter = v2.begin(); iter != v2.end(); iter++) &2nICAN[  
cout << *iter << " "; 7+;.Q  
cout << endl; Dy*K;e-+  
Bbtc[@"X  
v2.assign(v1.begin(), v1.end()); @RZbo@{~  
cout << "v2 = "; =zTpDL  
for (iter = v2.begin(); iter != v2.end(); iter++) \opcn\vW  
cout << *iter << " "; 55ft ,a  
cout << endl; H<tU[U=G  
b2H -D!YO^  
v3.assign(7, 3) ; @; tM R|p  
cout << "v3 = "; Cj=_WWo  
for (iter = v3.begin(); iter != v3.end(); iter++) yg4#,4---b  
cout << *iter << " "; k7& cc|y  
cout << endl; [{>3"XJ'  
/l+"aKW 2  
return 0; j'OXT<n*  
}
快速回复

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