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

Apakah perbezaan antara salinan dalam dan salinan cetek dalam javascript

WBOY
WBOYasal
2022-03-10 11:24:206731semak imbas

Dalam JavaScript, salinan cetek hanya menyalin alamat memori data asal, yang bersamaan dengan dua penunjuk data yang menunjuk ke alamat yang sama Jika mana-mana satu elemen data berubah, ia akan menjejaskan yang lain; dua elemen data salinan dalam Data menghala ke alamat yang berbeza, dan perubahan kepada mana-mana satu elemen tidak akan menjejaskan yang lain.

Apakah perbezaan antara salinan dalam dan salinan cetek dalam javascript

Persekitaran pengendalian tutorial ini: sistem Windows 10, versi JavaScript 1.8.5, komputer Dell G3.

Apakah perbezaan antara salinan dalam dan salinan cetek dalam JavaScript

Sebelum meneroka salinan cetek dan salinan dalam, mari kita fahami konsep timbunan dan timbunan

Timbunan dan timbunan Ia adalah kawasan yang dibahagikan kepada memori untuk penyimpanan. Timbunan diperuntukkan ruang memori secara automatik, yang dikeluarkan secara automatik oleh sistem; timbunan diperuntukkan memori secara dinamik, dan saiznya berubah-ubah dan tidak akan dikeluarkan secara automatik.

Kemudian lihat jenis data asas & jenis data rujukan (juga dikenali sebagai jenis data kompleks)

1 Jenis asas: String, Number, Boolean, null, undefined, Symbol (. baru dalam ES6, mewakili nilai unik); nilai jenis asas menduduki saiz tetap dalam ingatan dan disimpan dalam memori tindanan.

2. Jenis rujukan: Objek, Tatasusunan, Tarikh, Fungsi, dll.;

Konsep salinan dalam dan cetek

Nota: Perbezaan antara salinan dalam dan cetek hanya terpakai kepada objek kompleks seperti Array dan Objek.

1. Salinan cetek: Ia hanya menyalin alamat memori data asal, yang bersamaan dengan dua penunjuk data yang menunjuk ke alamat yang sama.

2. Salinan dalam: Kedua-dua data menghala ke alamat yang berbeza, dan elemen data tidak akan menjejaskan satu sama lain apabila ia berubah.

Contoh kajian

1 Salinan cetek

var arr = [0, 1, 2];
var arrB;
 
//把arr赋值给arrB
arrB = arr;
console.log("arr:", arr);
console.log("arrB:", arrB);
console.log("-----------改变arrB中数组元素的值后-----------");
arrB[0] = 5;
console.log("arr:", arr);
console.log("arrB:", arrB);

Hasil operasi: elemen tatasusunan arr berubah apabila elemen tatasusunan arrB berubah

2 (hanya salinan dalam peringkat pertama)

Nota: Apabila menggunakan salinan dalam, anda mesti menjelaskan keperluan untuk salinan dalam, iaitu menyalin dalam hanya atribut objek atau elemen tatasusunan secara rekursif tahap sifat objek dan elemen tatasusunan?

Tatasusunan salinan dalam

① Merentasi terus

var arr = [1, 2, 3, 4];
function copy(arr){
    var newArr = [];
    for(var i=0;i<arr.length;i++){
        newArr.push(arr[i]);
    }
    return newArr;
}
 
var arrB = copy(arr);
console.log("arrB:", arrB);
console.log("-----------改变arrB中数组元素的值后-----------");
arrB[0] = 5;
console.log("arr:", arr);
console.log("arrB:", arrB);

Hasil operasi: Perubahan elemen tatasusunan arrB tidak menjejaskan nilai elemen tatasusunan arr

② . concat(): digunakan untuk menyambung dua atau lebih tatasusunan. Kaedah ini tidak mengubah suai tatasusunan sedia ada, ia hanya mengembalikan salinan tatasusunan bercantum.

var arr = [0, 1, 2];
var arrB;
 
//把arr赋值给arrB
arrB = arr.concat();
console.log("arr:", arr);
console.log("arrB:", arrB);
console.log("-----------改变arrB中数组元素的值后-----------");
arrB[0] = 5;
console.log("arr:", arr);
console.log("arrB:", arrB);

Hasil operasi: elemen tatasusunan arr tidak berubah dengan perubahan dalam elemen tatasusunan arrB

③ slice(): Kaedah ini mengembalikan serpihan elemen yang dipintas daripada Borang tatasusunan sedia ada tatasusunan baru (jangan tukar tatasusunan asal).

var arr = [0, 1, 2, 4, 5];
var arrB;
 
//把arr赋值给arrB
arrB = arr.slice();
console.log("arr:", arr);
console.log("arrB:", arrB);
console.log("-----------改变arrB中数组元素的值后-----------");
arrB[0] = 10;
arr[4] = 8;
console.log("arr:", arr);
console.log("arrB:", arrB);

Hasil operasi: Perubahan dalam elemen dalam tatasusunan tidak akan menjejaskan satu sama lain

Tiga kaedah di atas hanya untuk tatasusunan mudah yang elemen tatasusunannya ialah jenis data asas. elemen tatasusunan peringkat Untuk tatasusunan pembolehubah jenis rujukan seperti objek atau tatasusunan, kaedah di atas akan gagal.

Cadangan berkaitan: Tutorial pembelajaran javascript

Atas ialah kandungan terperinci Apakah perbezaan antara salinan dalam dan salinan cetek dalam javascript. 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