Artikel ini berbagi salinan dangkal dan kode salinan yang dalam dari objek JavaScript untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
1. Salinan lampu
Salin berarti menyalin semua sifat objek induk ke objek anak.
Fungsi berikut adalah menyalin:
var cina = {nation: 'cina'} var doctor = {karir: 'Doctor'} function extandcopy (p) {var c = {}; untuk (var i di p) {c [i] = p [i]; } c.uber = p; kembali C; }Saat menggunakannya, tulis ini:
var Doctor = ExtleCopy (Cina); Doctor.Career = 'Doctor'; waspada (Dokter.Nation); // China
Namun, ada masalah dengan salinan seperti itu. Artinya, jika properti objek induk sama dengan array atau objek lain, maka pada kenyataannya, objek anak hanya mendapatkan alamat memori, bukan salinan nyata, jadi ada kemungkinan bahwa objek induk akan dirusak.
Silakan lihat, sekarang tambahkan properti "tempat lahir" ke Cina, yang nilainya merupakan array.
Cina.birthplaces = ['Beijing', 'Shanghai', 'Hong Kong'];
Melalui fungsi ExtleCopy (), dokter mewarisi bahasa Cina.
var Doctor = ExtleCopy (Cina);
Lalu kami menambahkan kota ke "tempat lahir" dokter:
Doctor.BirthPlaces.push ('xiamen');
Lihat hasil input
waspada (Doctor.BIRTHPLACES); // Beijing, Shanghai, Hong Kong, Xiamen
Peringatan (China.Birthplaces); // Beijing, Shanghai, Hong Kong, Xiamen
Akibatnya, kedua tempat kelahiran diubah.
Oleh karena itu, extleCopy () hanya menyalin data tipe dasar, dan kami menyebut salinan ini "salinan dangkal".
2. Salinan dalam
Karena salinan yang dangkal dan dalam memiliki kerugian seperti itu, mari kita lihat salinan yang dalam berikutnya
Yang disebut "salinan dalam" berarti bahwa ia dapat mewujudkan salinan array dan objek yang sebenarnya. Implementasinya tidak sulit, panggil saja "salinan dangkal" secara rekursif.
function DeepCopy (p, c) {var c = c || {}; untuk (var i di p) {if (typeof p [i] === 'objek') {c [i] = (p [i] .constructor === array)? []: {}; Deepcopy (p [i], c [i]); } else {c [i] = p [i]; }} return c; }Lihatlah cara menggunakannya:
Var Doctor = DeepCopy (Cina);
Sekarang, tambahkan properti ke objek induk dengan nilai sebagai array. Kemudian, ubah properti ini pada objek anak:
China.birthplaces = ['Beijing', 'Shanghai', 'Hong Kong']; Doctor.birthplaces.push ('Xiamen'); waspada (Doctor.Birthplaces); // Beijing, Shanghai, Hong Kong, Xiamen Alert (China.Birthplaces); // Beijing, Shanghai, Hong KongIni melengkapi salinannya;
$ .extend ()
$ .extend () di jQuery adalah sama.
$ .Extend ([Deep], Target, Object1 [, Objectn])
•dalam
Jenis: Boolean
Jika benar, gabungan menjadi rekursif (juga disebut salinan dalam).
•target
Jenis: Objek
Ekstensi objek. Ini akan menerima properti baru.
• Object1
Jenis: Objek
Objek yang berisi properti tambahan digabungkan ke dalam parameter pertama.
• Objectn
Jenis: Objek
Berisi atribut tambahan untuk bergabung ke dalam parameter pertama
Ketika kami menyediakan dua atau lebih objek ke $ .Extend (), semua properti objek ditambahkan ke objek target (parameter target).
Jika hanya satu parameter yang disediakan untuk $ .Extend (), ini berarti parameter target dihilangkan. Dalam hal ini, objek jQuery itu sendiri default ke objek target. Dengan cara ini, kita dapat menambahkan fitur baru di bawah jQuery namespace. Ini berguna untuk pengembang plugin ketika mereka ingin menambahkan fungsi baru ke jQuery.
Ingatlah bahwa objek target (parameter pertama) akan dimodifikasi dan akan dikembalikan melalui $ .extend (). Namun, jika kita ingin menjaga objek asli, kita dapat meneruskan objek kosong sebagai objek target:
var object = $ .extend ({}, objek1, objek2);
Secara default, operasi penggabungan melalui $ .Extend () tidak rekursif; Jika properti dari objek pertama itu sendiri adalah objek atau array, maka itu akan mengesampingkan properti sepenuhnya dengan kunci yang sama dari objek kedua. Nilai -nilai ini tidak akan digabungkan. Ini dapat dipahami dengan memeriksa nilai pisang dalam contoh di bawah ini. Namun, jika benar digunakan sebagai argumen pertama untuk fungsi, penggabungan rekursif akan dilakukan pada objek.
PERINGATAN: Menyerah false untuk parameter pertama tidak didukung.
1. Gabungkan dua objek dan ubah objek pertama.
var Object1 = {Apple: 0, Banana: {Weight: 52, Harga: 100}, Cherry: 97}; var Object2 = {pisang: {harga: 200}, durian: 100}; // gabungkan Object2 menjadi objek1 $ .Extend (Object1, Object2); // dengan asumsi json. ); // {"apple": 0, "pisang": {"harga": 200}, "cherry": 97, "durian": 100}2. Gabungkan dua objek dengan cara rekursif dan memodifikasi objek pertama.
var Object1 = {Apple: 0, Banana: {Weight: 52, Harga: 100}, Cherry: 97}; var Object2 = {pisang: {harga: 200}, durian: 100}; // gabungkan Object2 menjadi objek1, rekursif $. EXTEND (true, objek1, objek2); // asumsi json.string.string $. Extend (true, objek1, Object2); // asumsi Json.string. Object1)); // {"Apple": 0, "Banana": {"Weight": 52, "Price": 200}, "Cherry": 97, "Durian": 100}3. Gabungkan objek default dan opsi dan jangan memodifikasi objek default. Ini adalah model pengembangan plug-in yang umum digunakan.
var defaults = {validate: false, limit: 5, name: "foo"}; var options = {validate: true, name: "bar"}; // gabungan default dan opsi, tanpa memodifikasi defaultsvar pengaturan = $ .extend ({}, default, opsi); console.log (json.stringify ({{{{{{{{); console.log (json.stringify ({{{{{{); console.log (json.stringify ({{}); console.log (json.stringify ({}, default); console.log (json.stringify ({}); console. )); console.log (json.stringify (pengaturan)); // defaults - {"validate": false, "limit": 5, "name": "foo"} // options - {"validate": true, "name": "bar"} // Pengaturan - {"validasi": true, "": 5: 5JavaScript menentukan apakah objek itu sama
Dalam JavaScript, operasi kesetaraan termasuk "==", "===" Konsistensi. Tidak perlu menjadi mayoritas perbedaan antara keduanya. Dalam artikel ini, kita akan berbicara tentang bagaimana menentukan apakah dua objek sama? Anda mungkin berpikir bahwa jika dua objek memiliki sifat yang sama dan propertinya memiliki nilai yang sama, maka kedua objek tersebut sama. Lalu mari kita gunakan contoh untuk menunjukkan:
var obj1 = {name: "benjamin", sex: "Male"} var obj2 = {name: "benjamin", sex: "Male"} // output: false detik.log (obj1 == obj2); // output: false detik.log (obj1 =====);Dari contoh di atas, kita dapat melihat bahwa apakah Anda menggunakan "==" atau "==", false dikembalikan. Alasan utama adalah bahwa string dan angka tipe dasar dibandingkan dengan nilai, sedangkan objek (tanggal, array) dan objek biasa dibandingkan dengan alamat dalam memori yang ditunjukkan oleh pointer. Lihat contoh berikut:
var obj1 = {name: "benjamin", sex: "Male"}; var obj2 = {name: "benjamin", sex: "Male"}; var obj3 = obj1; // output: trueconsole.log (obj1 == obj3);//outputs: trueconsole. falseconsole.log (obj2 === obj3); // output: falseconsole.log (obj2 === obj3);Contoh di atas mengembalikan true karena pointer Obj1 dan OB3 menunjuk ke alamat yang sama dalam memori. Ini mirip dengan konsep nilai passing dan referensi yang lewat dalam bahasa yang berorientasi objek (Java/C ++). Karena, jika Anda ingin menentukan apakah dua objek sama, Anda harus jelas, apakah Anda mencoba untuk menentukan apakah sifat kedua objek tersebut sama, atau apakah nilai -nilai yang sesuai dengan sifatnya sama, atau apa?
function person (name) {this.name = name; } var p1 = orang baru ("p1"); var p2 = orang baru ("p2"); console.log (p1 == p2); // false person.prototype.sayhi = function () {// do Sayhi di sini} console.log (p1.sayhi () == p2.sayhi ()); // true console.log (p1.sayhi () == p2.sayhi ()); // true console.log (p1.sayhi () === p2.sayhi ()); //BENARDi atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.