Rumah > Artikel > hujung hadapan web > Apakah perbezaan antara salinan dalam dan salinan cetek dalam javascript
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.
Persekitaran pengendalian tutorial ini: sistem Windows 10, versi JavaScript 1.8.5, komputer Dell G3.
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!