การคัดลอกวัตถุในภาษาใดก็ได้มี 2 วิธี คือ การคัดลอกแบบลึก และการคัดลอกแบบตื้น
สำเนาตื้นและสำเนาลึกเป็นภาษาที่ไม่เชื่อเรื่องพระเจ้า สำเนาตื้น ทำสำเนาให้น้อยที่สุด สำเนาตื้นของคอลเล็กชันคือสำเนาของโครงสร้างคอลเล็กชัน ไม่ใช่องค์ประกอบ ด้วยสำเนาที่ตื้น ตอนนี้คอลเลกชั่นสองคอลเลกชั่นแบ่งปันองค์ประกอบแต่ละอย่างร่วมกัน
ตัวอย่าง
let innerObj = {
a: 'b',
c: 'd'
}
let obj = {
x: "test",
y: innerObj
}
// Create a shallow copy.
let copyObj = Object.assign({}, obj);
// Both copyObj and obj's prop y now refers to the same innerObj. Any changes to this will be reflected.
innerObj.a = "test"
console.log(obj)
console.log(copyObj) ผลลัพธ์
สิ่งนี้จะให้ผลลัพธ์ -
{ x: 'test', y: { a: 'test', c: 'd' } }
{ x: 'test', y: { a: 'test', c: 'd' } } โปรดทราบว่าสำเนาแบบตื้นจะไม่สร้างสำเนาแบบเรียกซ้ำ มันทำได้ในระดับสูงสุด
สำเนาลึกทำซ้ำทุกอย่าง สำเนาลึกของคอลเล็กชันคือคอลเลกชั่น 2 คอลเลกชั่น โดยที่องค์ประกอบทั้งหมดในคอลเล็กชันดั้งเดิมถูกโคลน
ตัวอย่าง
let innerObj = {
a: 'b',
c: 'd'
}
let obj = {
x: "test",
y: innerObj
}
// Create a deep copy.
let copyObj = JSON.parse(JSON.stringify(obj))
// Both copyObj and obj's prop y now refers to the same innerObj. Any changes to this will be reflected.
innerObj.a = "test"
console.log(obj)
console.log(copyObj) ผลลัพธ์
สิ่งนี้จะให้ผลลัพธ์ -
{ x: 'test', y: { a: 'test', c: 'd' } }
{ x: 'test', y: { a: 'b', c: 'd' } }