Rumah  >  Artikel  >  hujung hadapan web  >  Apakah perbezaan antara salinan dalam dan salinan cetek dalam JS

Apakah perbezaan antara salinan dalam dan salinan cetek dalam JS

WBOY
WBOYasal
2024-02-18 10:26:06381semak imbas

Apakah perbezaan antara salinan dalam dan salinan cetek dalam JS

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实现了一个浅拷贝。当修改obj1age属性时,obj2age属性也被修改了,这是因为它们指向同一块内存地址。

接下来,我们来看一个深拷贝的示例:

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的深拷贝。即使修改了obj1age属性,但obj2age

Seterusnya, mari lihat contoh salinan dalam:

rrreee

Dalam kod di atas, kami mentakrifkan fungsi deepClone 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn