Apakah perbezaan antara salinan dalam dan salinan cetek dalam JS Contoh kod khusus diperlukan
Dalam JavaScript, terdapat dua kaedah menyalin objek: salinan cetek dan salinan dalam. Salinan cetek hanya menyalin alamat rujukan objek, manakala salinan dalam mencipta salinan bebas sepenuhnya.
Salinan cetek adalah untuk menyalin alamat rujukan objek asal ke objek baharu. Ia menunjuk ke ruang memori yang sama. Apabila sifat mana-mana satu objek diubah suai, sifat sepadan objek lain juga akan diubah suai. Ini kerana mereka berkongsi alamat memori yang sama.
Salinan dalam adalah untuk mencipta objek baharu dan menyalin semua atribut dalam objek asal kepada objek baharu satu demi satu Objek baharu dan objek asal tidak mempunyai pengaruh antara satu sama lain. Walaupun anda mengubah suai sifat satu objek, sifat objek lain tidak akan terjejas.
Di bawah, saya akan menggambarkan perbezaan antara salinan cetek dan salinan dalam melalui contoh kod tertentu.
Mula-mula, mari lihat contoh salinan cetek:
let obj1 = {name: "Alice", age: 20}; let obj2 = obj1; obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 21}
Dalam kod di atas, kami melaksanakan salinan cetek dengan memberikan obj1
kepada obj2
. Apabila atribut age
obj1
diubah suai, atribut age
obj2
juga diubah suai kerana ia menunjuk ke alamat ingatan yang sama. obj1
赋值给obj2
实现了一个浅拷贝。当修改obj1
的age
属性时,obj2
的age
属性也被修改了,这是因为它们指向同一块内存地址。
接下来,我们来看一个深拷贝的示例:
function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } let clone = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; } let obj1 = {name: "Alice", age: 20}; let obj2 = deepClone(obj1); obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 20}
在上述代码中,我们定义了一个deepClone
函数,用于实现深拷贝。该函数首先判断传入的参数是否为null或不是对象类型,如果是则直接返回,否则创建一个与传入对象类型相同的空对象clone
。然后通过遍历原对象的属性,递归调用deepClone
函数对每个属性进行深拷贝,并赋值给相应的clone
属性。最后返回新对象clone
。
通过使用deepClone
函数,我们实现了对obj1
的深拷贝。即使修改了obj1
的age
属性,但obj2
的age
rrreee
Dalam kod di atas, kami mentakrifkan fungsideepClone
untuk melaksanakan salinan dalam. Fungsi ini terlebih dahulu menentukan sama ada parameter yang diluluskan adalah nol atau tidak daripada jenis objek. Jika ya, ia akan kembali secara langsung, jika tidak, ia akan mencipta objek kosong clone
daripada jenis yang sama dengan objek yang diluluskan. Kemudian dengan merentasi sifat objek asal, memanggil fungsi deepClone
secara rekursif untuk menyalin setiap sifat secara mendalam dan menetapkannya kepada harta klon
yang sepadan. Akhirnya, objek baharu klon
dikembalikan. 🎜🎜Dengan menggunakan fungsi deepClone
, kami melaksanakan salinan mendalam obj1
. Walaupun atribut age
obj1
diubah suai, atribut age
obj2
kekal tidak berubah kerana ia adalah dua sepenuhnya objek bebas. 🎜🎜Ringkasnya, salinan cetek hanya menyalin alamat rujukan objek, manakala salinan dalam mencipta salinan bebas sepenuhnya. Salinan dalam boleh memastikan objek asal tidak terjejas apabila mengubah suai objek salinan, dan sesuai untuk menyalin objek dengan struktur bersarang. Perlu diingatkan bahawa dalam pembangunan sebenar, salinan dalam boleh menyebabkan overhed prestasi yang besar, jadi perlu memilih kaedah salinan yang sesuai berdasarkan situasi sebenar. 🎜Atas ialah kandungan terperinci Apakah perbezaan antara salinan dalam dan salinan cetek dalam JS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!