Rumah > Soal Jawab > teks badan
Kadang-kadang apabila beroperasi pada tatasusunan, kaedah klon digunakan saya rasa tidak mengapa untuk menetapkan nilai secara langsung tanpa menggunakan kaedah ini. Untuk menjimatkan memori? Terdapat juga salinan cetek, salinan dalam, dan lain-lain, maafkan saya kerana menjadi orang baru. .
typecho2017-06-26 10:54:02
Kelebihannya ialah tidak seperti "=", tatasusunan klon adalah bebas dalam ingatan, dan anda boleh melakukan apa sahaja yang anda mahu dengannya.
Dalam js, tatasusunan dan objek ialah jenis rujukan.
const arr = [1, 2, 3, 4, 5, 6];
const arr1 = arr; // 直接赋值,arr1指向的是arr的内存,也就是说arr发生改变时,arr1也会被改变
arr.push(123);
console.log(arr1); // [1, 2, 3, 4, 5, 6, 123]
const arr = [1, 2, 3, 4, 5, 6];
const arr1 = arr.slice(0); // 克隆了一个arr1,arr与arr1指向不同的内存,arr的改变并不会影响到arr1
arr.push(123);
console.log(arr1); // [1, 2, 3, 4, 5, 6]
Jadi, tujuan pengklonan adalah untuk menjana salinan data baharu tanpa mencemarkan data asal.
Bagi salinan dalam dan salinan cetek:
const obj1 = {
name: 'Ash',
class: {
a: 1,
b: 2,
}
};
// 浅拷贝
const obj2 = {};
for (let key in obj1) {
obj2[key] = obj1[key];
}
// 深拷贝
const copyObj = (obj) => {
const newObj = {};
for (let key in obj) {
if (typeof obj[key] !== 'object') {
newObj[key] = obj[key];
} else {
newObj[key] = copyObj(obj[key]);
}
}
return newObj;
}
const obj3 = copyObj(obj1);
obj1.name = 'Coco';
obj1.class.a = 100;
console.log(obj2.name, obj2.class.a); // Ash 100
console.log(obj3.name, obj3.class.a); // Ash 1
Anda boleh melihat bahawa perbezaan antara salinan cetek dan salinan dalam ialah salinan cetek hanya melintasi lapisan pertama obj1, dan kemudian menetapkan setiap atribut obj1 kepada obj2 manakala salinan dalam tidak, apabila nilai atribut ialah objek Pada ini masa, salinan dalam akan mencipta objek kosong baharu, kemudian tetapkan nilai objek kepada objek kosong, dan kemudian kembalikan objek kosong sebagai atribut obj3.
给我你的怀抱2017-06-26 10:54:02
Prinsip yang sangat penting dalam pengaturcaraan JS ialah"Jangan sentuh objek yang bukan milik anda"
Untuk memberi anda metafora yang jelas, saya meminjamkan anda sebuah buku (objek), dan saya fikir anda hanya mahu membacanya (membaca), tetapi anda menggunakannya untuk berlatih kaligrafi (menulis saya tidak boleh membaca buku itu). anda kembalikan kepada saya kandungan biasa.
Dan deepClone menyelesaikan masalah ini, saya memberi anda sebuah buku, anda pergi dan menyalinnya, pulangkan buku itu kepada saya sebagaimana adanya, dan anda boleh membuang salinan itu mengikut kehendak anda.