在組件直接的通訊中,我們經(jīng)常需要傳遞復(fù)雜的數(shù)據(jù)對(duì)象data,如果接收的組件直接對(duì)data進(jìn)行處理,其處理結(jié)果將是發(fā)送方和接收方的數(shù)據(jù)data都被改變,如果你需要發(fā)送方和接收方各自保留自己的數(shù)據(jù)格式和處理結(jié)果,互不影響,接收方就需要對(duì)data進(jìn)行深度copy,斷開(kāi)數(shù)據(jù)的引用關(guān)系,然后再對(duì)copy后的對(duì)象進(jìn)行處理。
一、簡(jiǎn)單對(duì)象的復(fù)制
1.json對(duì)象 Object.assign
對(duì)于簡(jiǎn)單的json對(duì)象(只有一層結(jié)構(gòu))可以直接用Object.assign();
let person={ name:'Tom', age:25};
let person2=Object.assign({},person);
person2.name='Jim';
運(yùn)行結(jié)果:
person==>{ name:'Tom', age:25}
person2==>{ name:'Jim', age:25}
2.數(shù)組對(duì)象 concat/filter
let arr1=[1,2,4,5,6];
let arr2=arr1.concat(9);
let arr3=arr1.filter(i=>{return i!=4;});
運(yùn)行結(jié)果:
arr2==>[1,2,4,5,6,9]
arr3==>[1,2,5,6]
然后對(duì)arr2和arr3加入數(shù)據(jù):
arr2.push(11);
arr3.push(7);
運(yùn)行結(jié)果:
arr1==>[1,2,4,5,6]
arr2==>[1,2,4,5,6,9,11]
arr3==>[1,2,5,6,7]
二、復(fù)雜對(duì)象的復(fù)制(對(duì)象的深度超過(guò)2層,并包含json和數(shù)組等類(lèi)型)
let person={ name:'Tom', age:25, friends:[ 'Jack', 'Tim' , 'Hp' ]};
let person2=Object.assign({},person});
運(yùn)行結(jié)果:
person==>{ name:'Tom', age:25, friends:[ 'Jack', 'Tim' , 'Hp' ]}
person2==>{ name:'Tom', age:25, friends:[ 'Jack', 'Tim' , 'Hp' ]}
如果直接用Object.assign復(fù)制,對(duì)name和age的更改還好,但是如果對(duì)屬性friends修改,將會(huì)破壞person的數(shù)據(jù)。
person2.name='Li';
person2.friends=['Jack', 'Tim' , 'Hp','Sam'] ;
運(yùn)行結(jié)果:
person==>{ name:'Tom', age:25, friends:[ 'Jack', 'Tim' , 'Hp','Sam' ]}
person2==>{ name:'Li', age:25, friends:[ 'Jack', 'Tim' , 'Hp' ,'Sam']}
這種情況下可以用json對(duì)象轉(zhuǎn)字符串的方式來(lái)實(shí)現(xiàn)復(fù)制:
let person={ name:'Tom', age:25, friends:[ 'Jack', 'Tim' , 'Hp' ]};
let person2=JSON.stringify(person);
person2=JSON.parse(person2);
person2.name='Li';
person2.friends=['Jack', 'Tim' , 'Hp','Sam'] ;
運(yùn)行結(jié)果:
person==>{ name:'Tom', age:25, friends:[ 'Jack', 'Tim' , 'Hp' ]}
person2==>{ name:'Li', age:25, friends:[ 'Jack', 'Tim' , 'Hp' ,'Sam']}