Penting untuk memahami apa yang =dilakukan dan tidak dilakukan oleh operator di JavaScript.
The =operator tidak membuat salinan data.
The =Operator menciptakan baru referensi ke yang sama data.
Setelah Anda menjalankan kode asli Anda:
var a = $('#some_hidden_var').val(),
b = a;
adan bsekarang ada dua nama berbeda untuk objek yang sama .
Setiap perubahan yang Anda lakukan pada konten objek ini akan terlihat sama, baik Anda mereferensikannya melalui avariabel atau bvariabel. Mereka adalah objek yang sama.
Jadi, ketika Anda nanti mencoba untuk "kembali" bke aobjek asli dengan kode ini:
b = a;
Kode sebenarnya tidak melakukan apa - apa , karena adan bmerupakan hal yang persis sama. Kode tersebut sama seperti jika Anda menulis:
b = b;
yang jelas tidak akan melakukan apapun.
Mengapa kode baru Anda berfungsi?
b = { key1: a.key1, key2: a.key2 };
Di sini Anda membuat objek baru dengan {...}literal objek. Objek baru ini tidak sama dengan objek lama Anda. Jadi Anda sekarang menyetel bsebagai referensi ke objek baru ini, yang melakukan apa yang Anda inginkan.
Untuk menangani objek arbitrer, Anda dapat menggunakan fungsi kloning objek seperti yang tercantum dalam jawaban Armand, atau karena Anda menggunakan jQuery, cukup gunakan $.extend()fungsi tersebut . Fungsi ini akan membuat salinan dangkal atau salinan dalam dari suatu objek. (Jangan bingung ini dengan $().clone()metode untuk menyalin elemen DOM, bukan objek.)
Untuk salinan dangkal:
b = $.extend( {}, a );
Atau salinan dalam:
b = $.extend( true, {}, a );
Apa perbedaan antara salinan dangkal dan salinan dalam? Salinan dangkal mirip dengan kode Anda yang membuat objek baru dengan literal objek. Ini membuat objek tingkat atas baru yang berisi referensi ke properti yang sama seperti objek aslinya.
Jika objek Anda hanya berisi tipe primitif seperti angka dan string, salinan dalam dan salinan dangkal akan melakukan hal yang persis sama. Tetapi jika objek Anda berisi objek atau larik lain yang bersarang di dalamnya, salinan dangkal tidak akan menyalin objek bertingkat itu, itu hanya membuat referensi ke sana. Jadi, Anda bisa memiliki masalah yang sama dengan objek bersarang yang Anda miliki dengan objek level teratas. Misalnya, diberikan objek ini:
var obj = {
w: 123,
x: {
y: 456,
z: 789
}
};
Jika Anda melakukan penyalinan dangkal dari objek tersebut, maka xproperti objek baru Anda adalah objek yang sama xdari aslinya:
var copy = $.extend( {}, obj );
copy.w = 321;
copy.x.y = 654;
Sekarang objek Anda akan terlihat seperti ini:
// copy looks as expected
var copy = {
w: 321,
x: {
y: 654,
z: 789
}
};
// But changing copy.x.y also changed obj.x.y!
var obj = {
w: 123, // changing copy.w didn't affect obj.w
x: {
y: 654, // changing copy.x.y also changed obj.x.y
z: 789
}
};
Anda dapat menghindari ini dengan salinan dalam. Salinan dalam berulang ke dalam setiap objek dan larik bersarang (dan Tanggal dalam kode Armand) untuk membuat salinan objek tersebut dengan cara yang sama seperti membuat salinan objek tingkat atas. Jadi, perubahan copy.x.ytidak akan berpengaruh obj.x.y.
Jawaban singkat: Jika ragu, Anda mungkin menginginkan salinan yang mendalam.
aditetapkan dari.val()saya menganggap itu adalah JSON (string), bukan objek - apakah itu benar? Apakah Anda menggunakanJSON.parse(a)suatu saat untuk mendapatkan objek yang sebenarnya?