Bagaimana cara menyalin objek ke objek lain dalam javascript?

Dalam artikel ini, Anda akan mempelajari apa itu penyalinan dangkal dan dalam, dan cara terbaik untuk menyalin objek dalam JavaScript

Penyalinan Dangkal vs. Menyalin Dalam

Dalam operasi penugasan ulang yang melibatkan tipe data primitif seperti string, angka, dan boolean, variabel asli disalin oleh JavaScript.  

Sebagai contoh, perhatikan kode berikut

1
let x = 3
2
y = x //  x is copied into y

3
4
y++ // y is incremented

5
6
console.log(y) // now 4

let x = 3
0
let x = 3
1

Dalam hal ini, nilai

3
_31 disalin ke
3
32, lalu
3
33 terputus dari
3
32. Jadi bermutasi
3
32 tidak mempengaruhi
3
33

Sebaliknya, dengan tipe data non-primitif seperti array dan objek, hanya referensi ke nilai yang diteruskan. Jadi saat salinannya dimutasi, yang asli juga akan dimutasi. Ini juga dikenal sebagai penyalinan dangkal

1
let x = 3
3
2
3
let x = 3
6
4
let x = 3
8
5
6
2
1
let x = 3
0
2
3

Sebaliknya, jika kita ingin menyalin sebuah objek sehingga kita dapat memodifikasinya tanpa mempengaruhi objek aslinya, kita perlu membuat salinan yang dalam.  

5 Cara untuk Menyalin Objek Dalam JavaScript

Dalam JavaScript, kita dapat melakukan penyalinan pada objek menggunakan metode berikut

MetodeProsKonstruktif dan langsung, defaultnya hanya salinan dangkal objeksalinan dalam objek bersarangtidak menyalin fungsimenyalin anggota langsung dari suatu objek—termasuk fungsitidak menyalin dalam objek bersarangsintaks sederhana, cara yang lebih disukai untuk menyalin objektidak menyalin dalam objek bersarangkloning objek bersarang termasuk fungsimenambah

Semua metode ini memiliki pro dan kontra. Mari kita lihat lebih dekat masing-masing

Shallow Copy Object by Assignment

Anda dapat membuat salinan objek yang dangkal hanya dengan menugaskan objek asli ke variabel baru.  

Perhatikan objek berikut

1
2
5
2
2
7
3
2
9
4
y = x //  x is copied into y

1
5
y = x //  x is copied into y

3

Untuk membuat salinan objek

3
_42, kami menetapkan objek ke variabel baru seperti itu

1
y = x //  x is copied into y

5
2
3
y = x //  x is copied into y

8
4
3
0
5
6
3
3
let x = 3
0
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5
4
6
3
5
4
8
3
7
y++ // y is incremented

0
3
9
y++ // y is incremented

2
4
1
y++ // y is incremented

4
4
3
y++ // y is incremented

6
y++ // y is incremented

7

Seperti yang diamati pada output konsol, kami sekarang telah menyalin objek dari

3
42 ke
3
44

Namun, yang kami lakukan hanyalah membuat referensi ke objek aslinya. Setiap kali kami mengubah properti di objek

3
44, kami juga akan mengubah objek asli (
3
42) seperti yang kami lakukan di kode berikut

1
y++ // y is incremented

9
2
3
y = x //  x is copied into y

8
4
3
0
5
6
3
3
let x = 3
0
3
5
3
6
6
1
3
8
3
9
4
0
4
1
4
2
4
3
4
4
3
5
4
6
6
1
4
8
3
9
y++ // y is incremented

0
4
1
y++ // y is incremented

2
4
3
y++ // y is incremented

4
y++ // y is incremented

7

Jadi ketika tipe data non-primitif (array atau objek) ditugaskan ke variabel baru, JavaScript membuat salinan dangkal dari objek asli

Salin Objek Dengan 338 dan 339

Metode

3
38 mengambil objek dan membuat string JSON darinya. Metode
3
39 mengurai string dan menampilkan objek JavaScript

Kita dapat menggabungkan kedua metode ini untuk membuat salinan objek dengan cara berikut

1
2
5
2
2
7
3
2
9
4
y = x //  x is copied into y

1
5
y = x //  x is copied into y

3
6
let x = 3
0
let x = 3
12
3
6
3
8
y = x //  x is copied into y

8
4
0
3
0
4
2
4
4
let x = 3
20
4
6
3
5
4
8
3
7
y++ // y is incremented

0
3
9
y++ // y is incremented

2
4
1
y++ // y is incremented

4
4
3
y++ // y is incremented

6
3
5
let x = 3
33
3
7
let x = 3
35
3
9
let x = 3
37
4
1
let x = 3
39
4
3
let x = 3
41
y++ // y is incremented

7

Saat objek salinan dimutasi, objek aslinya tetap sama

1
let x = 3
44
2
3
y = x //  x is copied into y

8
4
3
0
5
6
let x = 3
20
let x = 3
0
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
3
5
4
6
let x = 3
66
4
8
3
9
y++ // y is incremented

0
4
1
y++ // y is incremented

2
4
3
y++ // y is incremented

4
y++ // y is incremented

7

Namun, ada satu peringatan untuk menggunakan pendekatan ini.

3
_38 tidak menyalin fungsi

Misalkan kita memiliki metode dalam objek kita

3
_42 disebut
3
53

1
2
5
2
2
7
3
2
9
4
let x = 3
82
5
let x = 3
84
6
let x = 3
86
let x = 3
0
let x = 3
88________4______6
y = x //  x is copied into y

3

Fungsi tidak akan tersedia di objek yang disalin. Dengan demikian, metode ini mencapai salinan dalam hanya jika tidak ada fungsi di dalam objek

Salin Objek Dengan 354

Sebelum ES6,

3
54 adalah cara paling populer untuk menyalin objek secara mendalam

1
2
5
2
2
7
3
2
9________5___
let x = 3
82
5
__________________________________________________________________________________________________________________________________________________________________________

3
_54 akan menyalin semuanya ke objek baru, termasuk fungsi apa pun. Memutasi objek yang disalin juga tidak memengaruhi objek asli

1
let x = 3
44
2
3
y = x //  x is copied into y

8
4
3
0
5
6
let x = 3
20
let x = 3
0
3
5
3
6
2
23
3
8
2
25
4
0
2
27
4
2
2
29
4
4
2
31
4
6
2
33
4
8
4
3
y++ // y is incremented

0
3
5
y++ // y is incremented

2
2
39
y++ // y is incremented

4
2
25
y++ // y is incremented

6
2
27
let x = 3
33
2
29
let x = 3
35
2
31
let x = 3
37
2
33
let x = 3
39
4
3
let x = 3
41
y++ // y is incremented

7

Namun, satu hal yang perlu diingat tentang

3
54 adalah bahwa metode ini hanya melakukan penyalinan dalam sebagian pada objek

Untuk memahami apa artinya, mari kita pertimbangkan hal berikut

1
2
5
2
2
7
3
2
9________5___
let x = 3
82
5
2
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________g EX

Seperti yang diamati, kami menambahkan properti location dan memberikan objek sebagai nilainya. Sekarang kami memiliki struktur yang lebih kompleks yang berisi objek bersarang.  

Setiap kali kami mengubah properti di dalam objek bersarang (di

3
44), itu juga akan mengubah properti yang sama di objek asli (
3
59). Mari lihat

1
let x = 3
44
2
2
76
3
4
5
y = x //  x is copied into y

8
6
3
0
let x = 3
0
3
6
let x = 3
20
3
8
3
5
4
0
3
7
4
2
3
9
4
4
2
93
4
6
2
95
4
8
2
97
y++ // y is incremented

0
4
1
y++ // y is incremented

2
4
3
y++ // y is incremented

4
4
5
y++ // y is incremented

6
3
5
let x = 3
33
let x = 3
66
let x = 3
35
3
9
let x = 3
37
2
93
let x = 3
39
2
95
let x = 3
41
2
97
y = x //  x is copied into y

16
4
1
y = x //  x is copied into y

18
4
3
y = x //  x is copied into y

20
y++ // y is incremented

7

Meskipun properti

3
_60 di objek asli tetap tidak tersentuh, properti
3
61 dimutasi oleh operasi penugasan kembali

Oleh karena itu, metode

3
54 harus digunakan untuk menyalin secara mendalam objek yang tidak memiliki objek bersarang.  

Cara Terbaik untuk Menyalin Dalam di JavaScript. Operator Penyebaran

Cara lain untuk menyalin objek dalam JavaScript adalah dengan operator penyebaran ES6. Menggunakan tiga titik (

3
_40) mengumpulkan semua nilai pada objek asli ke objek lain

1
2
5
2
2
7
3
2
9
4
y = x //  x is copied into y

1
5
y = x //  x is copied into y

3
6
let x = 3
0
y = x //  x is copied into y

34
3
6
3
8
y = x //  x is copied into y

37
4
0
4
2
let x = 3
20
4
4
3
5
4
6
3
7
4
8
3
9
y++ // y is incremented

0
4
1
y++ // y is incremented

2
4
3
y++ // y is incremented

4
y++ // y is incremented

7

Namun, seperti

3
54, operator spread hanya membuat salinan sebagian. Jadi objek apa pun dengan objek bersarang tidak akan disalin dalam-dalam

Untuk membuat salinan lengkap dengan operator spread, kita harus menulis beberapa kode tambahan

Pertimbangkan objek pengguna yang sama tetapi dengan objek bersarang

1
y = x //  x is copied into y

54
2
2
7
3
2
9
4
let x = 3
82
5
_________________________________________________________________________________________________________________________________________________________________________________________________________________________g EX

Untuk menghindari mutasi objek asli, yaitu

3
42, kita harus menyebarkan objek salinan sebelum membuat perubahan langsung ke salah satu propertinya. Untuk objek bersarang apa pun, kita juga harus menyebarkan sub-objek itu sebelum membuat perubahan pada propertinya

1
y = x //  x is copied into y

73
2
y = x //  x is copied into y

75
3
y = x //  x is copied into y

77
4
y = x //  x is copied into y

79
5
y = x //  x is copied into y

81
6
y = x //  x is copied into y

83
let x = 3
0
y = x //  x is copied into y

85________4______6________3______3

Di sini, kami mengubah

3
_60, yang merupakan properti tingkat atas di
3
44, dan
3
61, yang merupakan sub-properti

Kali ini, operasi penyebaran akan memberikan salinan dalam yang lengkap di mana objek asli tidak akan terpengaruh oleh mutasi apa pun pada salinan (

3
44)

1
y = x //  x is copied into y

8
2
3
0
3
4
let x = 3
20
5
3
5
6
3
7
let x = 3
0
3
9
3
6
2
93
3
8
3
04
4
0
2
97
4
2
4
1
4
4
4
3
4
6
4
5
4
8
3
5
y++ // y is incremented

0
let x = 3
66
y++ // y is incremented

2
3
9
y++ // y is incremented

4
2
93
y++ // y is incremented

6
2
95
let x = 3
33
2
97
let x = 3
35
4
1
let x = 3
37
4
3
let x = 3
39
y++ // y is incremented

7

Gunakan Lodash 341 untuk Penyalinan Mendalam

Lodash juga menyediakan metode utilitas

3
_71 untuk kloning objek dalam JavaScript.  

Kesimpulan

Seperti yang Anda lihat, ada sejumlah cara untuk menyalin variabel dalam JavaScript. Tak satu pun dari mereka sempurna untuk setiap kesempatan, jadi Anda harus berhati-hati memilih metode terbaik untuk setiap situasi

Bagaimana cara menyalin satu objek ke objek lain dalam JavaScript?

Objek. metode penetapan() dapat digunakan untuk menggabungkan dua objek dan menyalin hasilnya ke target baru . Sama seperti operator spread, Jika objek sumber memiliki nama properti yang sama, objek terakhir akan menggantikan objek sebelumnya. Sekarang, mari kita lihat contoh lain penggabungan di TypeScript.

Bagaimana cara menyalin satu objek ke objek lainnya?

Umumnya, copy constructor adalah sebuah constructor yang membuat objek dengan cara menginisialisasi objek dari kelas yang sama, yang telah dibuat sebelumnya. Java does support for copy constructors but you need to define them yourself.

Bagaimana cara menetapkan satu objek ke objek lain dalam JavaScript?

Demo JavaScript. Obyek. tetapkan() .
target const = {a. 1, b. 2};
sumber const = { b. 4, c. 5 };
const dikembalikanTarget = Obyek. menetapkan (target, sumber);
menghibur. log(target);
menghibur. log(returnedTarget === target);

Bisakah suatu objek disalin?

Objek ditetapkan dan disalin dengan referensi . Dengan kata lain, variabel tidak menyimpan "nilai objek", tetapi "referensi" (alamat dalam memori) untuk nilai. Jadi menyalin variabel seperti itu atau meneruskannya sebagai argumen fungsi menyalin referensi itu, bukan objek itu sendiri.