Javascript中的Clone: 使用新對(duì)象復(fù)制已存在的對(duì)象
在Javascript中,clone就是指使用已有對(duì)象創(chuàng)建一個(gè)新對(duì)象。這個(gè)新對(duì)象的屬性值與原對(duì)象完全相同,但兩個(gè)對(duì)象實(shí)際上在內(nèi)存中是不同的,所以它們可以獨(dú)立于彼此存在,并且通過(guò)比較它們的指針地址可以發(fā)現(xiàn)它們是不同的。
方法1: 使用擴(kuò)展運(yùn)算符(...)
let obj1 = {a: 1, b: 2}; let obj2 = {...obj1}; obj2.a = 3; console.log(obj1.a); // 1 console.log(obj2.a); // 3
在這個(gè)例子中,...運(yùn)算符用于遍歷原對(duì)象obj1中的屬性,并將它們?nèi)繌?fù)制到新的對(duì)象obj2中。新對(duì)象中的屬性值與原對(duì)象完全相同,但對(duì)象本身不同,所以改變新對(duì)象中的屬性并不會(huì)影響原對(duì)象。
方法2: 使用Object.assign()
let obj1 = {a: 1, b: 2}; let obj2 = Object.assign({}, obj1); obj2.a = 3; console.log(obj1.a); // 1 console.log(obj2.a); // 3
這個(gè)例子展示了Object.assign()函數(shù)的用法。這個(gè)函數(shù)接受其自身為第一個(gè)參數(shù),接下來(lái)是其他要合并在一起的對(duì)象。在這個(gè)例子中,我們將一個(gè)空對(duì)象作為第一個(gè)參數(shù)傳遞給Object.assign(),并將我們要克隆的源對(duì)象作為第二個(gè)參數(shù)傳遞。這個(gè)函數(shù)返回結(jié)果是引用了所有對(duì)象的新對(duì)象,所以在新對(duì)象上進(jìn)行更改不會(huì)影響原始對(duì)象。
方法3: 使用JSON.parse()和JSON.stringify()
let obj1 = {a: 1, b: 2}; let obj2 = JSON.parse(JSON.stringify(obj1)); obj2.a = 3; console.log(obj1.a); // 1 console.log(obj2.a); // 3
這對(duì)方法是非常牢靠的,它可以克隆復(fù)雜的嵌套對(duì)象或數(shù)組,但卻有一個(gè)限制:它無(wú)法克隆函數(shù)。另外,如果在原對(duì)象中存在循環(huán)引用,這對(duì)方法也會(huì)失效。在這個(gè)例子中,我們首先將對(duì)象序列化為字符串(JSON.stringify()),然后再將其解析回一個(gè)新對(duì)象(JSON.parse())。這個(gè)新對(duì)象具有與源對(duì)象完全相同的屬性和值,而且可以在完全獨(dú)立的情況下對(duì)它們進(jìn)行更改。
總結(jié)
在Javascript中,有三種方法可以實(shí)現(xiàn)克隆對(duì)象。通過(guò)對(duì)這三種方法的了解,可以根據(jù)不同的需求選擇最適合的方法。