• 1434阅读
  • 1回复

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

楼层直达
y N,grU(  
1.Object.assign()基本用法: # GzowI'  
HmbQL2  
0@Z}.k30  
Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。 Dv~jVIXu  
L.:8qY  
%RzCJxT  
let targetObj1 = { a: 1 }; <4582x,G  
        let sourceObj1 = { b: 1 }; ;KT5qiqYH  
        let sourceObj11 = { c: 3 }; V+t's*9o3  
        Object.assign(targetObj1, sourceObj1, sourceObj11); 0xfF  
        console.log(targetObj1); ~,.;2K73  
注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。 KY\=D 2m  
5 &0qr$  
N t\ZM  
let targetObj1 = { a: 1, b: 2 }; P7$/yBI U  
        let sourceObj1 = { b: 1 }; P[tYu:  
        let sourceObj11 = { c: 3 }; &mm!UJ  
        Object.assign(targetObj1, sourceObj1, sourceObj11); ZKai*q4?  
        console.log(targetObj1); 4u#TKr.  
如果只有一个参数,Object.assign会直接返回该参数。 H^M>(kT#&  
eU8p;ajW!L  
l_Zx'm  
let targetObj1 = { a: 4 } }d%Fl}.Ez  
        Object.assign(targetObj1); a`>H69(bU  
        console.log(targetObj1) 8k;il54#  
如果该参数不是对象,则会先转成对象,然后返回。 d-T pY*v  
k`J|]99Wb  
-! ^D8^s  
console.log(typeof (Object.assign(2))); 6i%X f i  
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。 ]AX3ov6z9;  
e/}4Pt  
~nApRC)0  
console.log(typeof(Object.assign(null))); 9T0g%&  
S:1g(f*85  
console.log(typeof(Object.assign(underfind))); \r"gqv)^  
注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。 #@F.wV0  
zpZfsn!  
?/8V%PL~$  
Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。 %a!gN  
J|`.d46  
G"h}6Za;DO  
let obj1 = Object.assign({ dwb: 'zjl' }, Z}.ZTEB  
wZWAx  
Object.defineProperty({}, 'zmf', { #\\|:`YV  
MfO: BX@$  
enumerable: false, 1:J+`mzpl  
e0hY   
value: 'zmf' Rx?ze(  
6w[EJ;=p_  
}) ER0B{b  
*q+X ?3  
) W:K '2j  
c:""&>Z  
console.log(obj1); A# Y:VavQ?  
oXU b_/  
let obj2 = Object.assign({ dwb: 'zjl' }, ],Yy)<e.  
U*?`tdXJ$  
Object.defineProperty({}, 'zmf', { 13+. >  
V)P8w#,  
enumerable: true, JX{_,2*$  
a4pewg'  
value: 'zmf' ^9kx3Pw?8  
M~~)tJYsu  
}) uaZHM@D  
(p<pF].  
) n}c~+ 0`un  
cZ#%tT#  
console.log(obj2); |#'n VN.;  
W6B"QbHYz  
对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。 mv^X{T  
}Eh &'  
A WJA?  
var target = { a: { b: 'c', d: 'e' } } Z58{YCY  
x_r*<?OZ  
var source = { a: { b: 'hello' } } SYa O'c  
D"%>  
Object.assign(target, source); lnRL^ }  
上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。 BvUiH<-D  
QNH3\<IS  
Fu 5c_"!  
P>(FCX  
[v\m)5  
l>KkAA  
注意,Object.assign可以用来处理数组,但是会把数组视为对象。 ?:G 3U\M  
$lq.*UQ;0  
(e0(GOqf4  
console.log(Object.assign([1, 2, 3], [4, 5])); ?wFL\C  
其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。 6[S IDOp*^  
Z B`d&!W>  
opMnLor  
bc3`x1)\^  
iu3L9UfL[  
+wxsAGy_j  
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。 &xUD (  
5lM2nhlf'b  
7Gy:T47T\@  
var object1 = { a: { b: 1 } }; pTXF^:8  
Ov ^##E  
var object2 = Object.assign({}, object1); J_?v=dW`  
uqLP$At  
object1.a.b = 2; |gIE$rt-~W  
216$,4i  
console.log(object2.a.b); @w`wJ*I4,  
2.用途 O8 SE)R~  
9Vo*AK'&U  
{`,)<R>}  
2.1为对象添加属性 YoBe!-E  
NpaS2q-d  
*"OUwEl a  
(|NCxey  
2.2为对象添加方法 !F.h+&^D;  
V@[C=K  
<'N:K@Cs  
T5z]=Pd"^  
2.3克隆对象 ]qxl^Himq  
function copyFnc(origin) { 5{Q9n{dOh  
}1W@  
return Object.assign({}, origin) e~d=e3mBp  
MpBdke$  
} 8QoxU" c&  
hS&l4 \I'Z  
var sur = { a: 1, b: 2 }; 1GK>&;  
D~#%^a+Aq_  
console.log(copyFnc(sur)); &} { #g  
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 2;0eW&e   
P-3f51Q  
*l=(?Pe<  
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 : ]+6l  
LD1&8kJ*l  
9g>)7Ne  
function clone(origin) { G? XS-oSv  
|0Xf":  
let originProto = Object.getPrototypeOf(origin); 2`TV(U@  
Z&U:KrFH  
return Object.assign(Object.create(originProto), origin); M:b#">M  
r$8'1s37`  
} ex6R=97uA  
在JS里子类利用Object.getPrototypeOf去调用父类方法,用来获取对象的原型。 *0to,$ n  
5OzEY7K)  
4QTHBT+2`  
}>d  
gKQV99  
+@~WKa  
2.4 合并多个对象 dvU{U@:sz  
m uy^>2p  
<fM}Kk  
//多个对象合并到某个对象 I7~) q`  
q=Vh"]0g  
=^i K^)  
const merge = (target, ...sources) => Object.assign(target, ...sources); ^'a#FbMtt  
//多个对象合并到新对象 8QZI(Xe9r  
ft$RF  
~$J(it-a  
const merge = (...sources) => Object.assign({}, ...sources); zRou~Kxi  
>7zC-3  
+vaA P=  
=/`]lY&  
2.5为属性指定默认值 x~vNUyEN)  
y^ |u'XK  
(zsv!U  
const DEFAULTS = { QXN_ ?E,g/  
][ IOlR  
logLevel: 0, O9ps?{g  
X-(4/T+v  
outputFormat: 'html' n\3#69VY  
RB4 +"QUh  
}; ,Gg;:)k\  
-0x Q'1I  
function processContent(options) { 0Q`v#$?":  
m|F1_Ggz  
let options = Object.assign({}, DEFAULTS, options); L!lmy&1  
8-B7_GoJ+B  
} G}9f/$'3  
———————————————— `$ S&:Q,  
版权声明:本文为CSDN博主「想要飞翔的小猪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 bd~m'cob>  
原文链接:https://blog.csdn.net/dwb123456123456/article/details/83316471
 
只看该作者 安逸沙发  发表于: 2019-10-30
assign函数: >a8iY|QY  
(?zg.y  
函数原型: # ~<]z  
x%dny]O1;  
void assign(const_iterator first,const_iterator last); ~&Z>fgOTJ  
p%I)&- 8  
void assign(size_type n,const T& x = T()); GvVkb=="  
e#[Klh$]EW  
功能: lY,^  
/pMOinuO  
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。 (.-4Jn  
g *$2qKm  
实例: O:?3B!wF  
jE0oLEg&  
#include <vector> "#C2+SKM1  
#include <iostream> z:Am1B  
7|}4UXr7y  
int main( ) \%7*@&  
{ M5#wz0  
using namespace std; qO{z{@jo55  
vector<int> v1, v2, v3; ysnW3q!@  
vector<int>::iterator iter; TgkVd]4%  
JBY.er`6C  
v1.push_back(10); MCN>3/81  
v1.push_back(20); .SC *!,  
v1.push_back(30); 'rhgM/I  
v1.push_back(40); FJvY`zqB  
v1.push_back(50); 'jt7H{M  
v2.push_back(1); yTZev|ej@  
v2.push_back(2); %+*=Vr  
R+LKa Z  
cout << "v1 = " ; |~Dl<#58  
for (iter = v1.begin(); iter != v1.end(); iter++) *'((_ NZ>  
cout << *iter << " "; rC8p!e.yL  
cout << endl; tpWGmj fo>  
ox-m)z `7  
cout << "v2 = "; &nEL}GM)E  
for (iter = v2.begin(); iter != v2.end(); iter++) r;Sk[Y5#  
cout << *iter << " "; Nbl&al@"  
cout << endl; C m[}DB  
:T-DxP/  
v2 = v1; ;21D^e  
cout << "v2 = "; 3)G~ud  
for (iter = v2.begin(); iter != v2.end(); iter++) }4 0T'y  
cout << *iter << " "; Odwe1q&  
cout << endl; Xs2}n^#i  
0B.Gt&O al  
v2.assign(v1.begin(), v1.end()); UF"%FF  
cout << "v2 = "; )oIh?-WL  
for (iter = v2.begin(); iter != v2.end(); iter++) FL{Uz+Q  
cout << *iter << " "; Pb&tWv\ql  
cout << endl; =MNp;  
o[>d"Kp  
v3.assign(7, 3) ; 9c^,v_W@  
cout << "v3 = "; #/>TuJc  
for (iter = v3.begin(); iter != v3.end(); iter++) R4p Pt  
cout << *iter << " "; ]-gyXE1.r  
cout << endl; kmC@\xTp  
wnS,Jl  
return 0; KF(H >gs  
}
快速回复

限100 字节
安逸网提示:批量上传需要先选择文件,再选择上传
 
认证码:
上一个 下一个