Rumah >hujung hadapan web >tutorial js >Perbincangan ringkas tentang medium Javascript dan salinan mendalam_Pengetahuan asas

Perbincangan ringkas tentang medium Javascript dan salinan mendalam_Pengetahuan asas

WBOY
WBOYasal
2016-05-16 16:29:571433semak imbas

Dalam JavaScript, semua tugasan antara pembolehubah objek melepasi alamat Sesetengah pelajar mungkin bertanya objek mana yang merupakan objek. Mungkin lebih baik untuk memberi contoh:

Salin kod Kod adalah seperti berikut:

typeof(true) //"boolean"
typeof(1) //"nombor"
typeof("1") //"rentetan"
typeof({}) //"objek"
typeof([]) //"objek"
typeof(null) //"objek"
typeof(function(){}) //"function"

Jadi sebenarnya, objek utama yang perlu kita proses dalam salinan dalam adalah objek objek bukan objek hanya perlu diberikan secara langsung dan biasa. Idea saya untuk melaksanakan js deep copy ialah:

Lintas semua sifat objek,
Jika atribut ialah "objek", pengendalian khas diperlukan,
Jika objek ini istimewa dan merupakan tatasusunan, kemudian buat tatasusunan baharu dan salin elemen dalam tatasusunan dengan mendalam
Jika objek ini ialah objek bukan tatasusunan, hanya panggil kaedah salinan dalam secara rekursif padanya.
Jika ia bukan "objek", salin sahaja seperti biasa.

Berikut ialah pelaksanaan saya:

Salin kod Kod adalah seperti berikut:

Object.prototype.DeepCopy = fungsi () {
var obj, i;
obj = {};

untuk (attr dalam ini) {
Jika (this.hasOwnProperty(attr)) {
Jika (jenis(ini[attr]) === "objek") {
Jika (ini[attr] === batal) {
            obj[attr] = null;
}
           lain jika (Object.prototype.toString.call(this[attr]) === '[object Array]') {
             obj[attr] = [];
untuk (i=0; i               obj[attr].push(this[attr][i].DeepCopy());
          }
         } lain {
           obj[attr] = this[attr].DeepCopy();
}
} lain {
        obj[attr] = ini[attr];
}
}
}
Kembalikan obj;
};

Jika penyemak imbas menyokong ECMAScript 5, untuk menyalin dalam semua sifat sifat objek, anda boleh menggunakan

Salin kod Kod adalah seperti berikut:

Object.defineProperty(obj, attr, Object.getOwnPropertyDescriptor(this, attr));

untuk menggantikan

Salin kod Kod adalah seperti berikut:

obj[attr] = ini[attr];

Kelebihan melaksanakan kaedah ini secara langsung pada Object.prototype ialah semua objek akan mewarisi kaedah ini. Kelemahannya ialah sesetengah perpustakaan juga menulis semula objek Objek, jadi konflik kadangkala berlaku. Ini adalah sesuatu yang perlu diperhatikan. Kaedah penggunaan khusus adalah seperti berikut:

Salin kod Kod adalah seperti berikut:

Object.prototype.DeepCopy = fungsi () { ... }
var a = { x:1 };
var b = a;
var c = a.DeepCopy();
a.x = 2;
b.x = 3;
console.log(a.x); //3
console.log(b.x); //3
console.log(c.x); //1

Di atas adalah penjelasan tentang salinan dalam, tetapi kerana kita bercakap tentang salinan mendalam hari ini, kami juga ingin merumuskan secara ringkas persamaan dan perbezaan antara mereka.

Salinan cetek (klon bayangan): Hanya jenis asas dan jenis objek objek disalin, yang masih tergolong dalam rujukan asal.
Salinan dalam (klon dalam): bukan sahaja menyalin kelas asas objek, tetapi juga menyalin objek dalam objek asal Maksudnya, objek baharu sepenuhnya dijana.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn