Rumah  >  Soal Jawab  >  teks badan

javascript - Tugasan objek rujukan, salinan dalam dan cetek jquery.extend

Apabila jenis rujukan diperuntukkan kepada jenis rujukan lain, ia hanya menunjuk ke alamat yang sama, dan operasi mempengaruhi satu sama lain.
Salinan dalam adalah untuk mengagihkan semula ruang supaya ia dan objek atau tatasusunan sebelumnya tidak terjejas.
Salinan cetek adalah bersamaan dengan tugasan jenis rujukan.

var a={banner:{size:1,weight:'0.5kg'}};
var b={apple:{size:1},banner:{size:3}};
$.extend(true,a,b)=>{banner:{size:3,weight:'0.5kg'},apple:{size:1}};
$.extend(a,b)=>{banner:{size:3},apple:{size:1}};

Saya telah melihat kod sumber jquery memerlukan rekursi.
Tetapi saya tidak faham, apa kaitannya dengan pengaruh bersama, atau adakah pemahaman saya tentang konsep di atas salah

PHPzPHPz2685 hari yang lalu883

membalas semua(2)saya akan balas

  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:35:54

    Salinan cetek

    Hanya melintasi dan menetapkan semula kekunci peringkat atas objek (kepada rujukan yang sepadan), contohnya:

    var a = {
      x: {
        name: 'x',
        value: 10,
      },
      y: 10,
      o: {},
    }
    var b = {
      x: {
        name: 'x2',
        value: 20,
      },
      y: {
        name: 'y2',
        value: 20,
      },
      z: {}
    }
    $.extend(a, b)

    Dalam proses ini, semua elemen peringkat atas dikeluarkan daripada b, iaitu b.x, b.y, b.z, dan kemudian ditugaskan kepada kekunci sepadan satu demi satu, jadi akhirnya a mempunyai a.x, a.y, a.z dan pada masa yang sama, a.o juga Kekal dalam a, kemudian a.x === b.x, a.y === b.y, a.z === b.z, kerana kesemuanya adalah rujukan yang menunjuk kepada objek yang sama. Oleh kerana ia adalah rujukan, apabila anda mengendalikan a.x, seperti a.x.name = 'x3', maka b.x.name juga menjadi 'x3'.

    Salinan dalam

    Salinan dalam akan masuk jauh ke dalam lapisan terakhir elemen objek dan menetapkannya semula dan bukannya merujuknya. Ambil a dan b di atas sebagai contoh, laksanakan:

    $.extend(true, a, b)

    Ia akan merentasi jauh ke dalam b, dan membandingkan nilai setiap nod dengan nod yang sepadan dengan a (tepat sama jika ia berbeza, buka ruang storan untuk a dan tetapkan nilainya jika a tidak wujud). , nod ini akan digunakan untuknya. Tiada kesamaan antara nod anak tahap pertama a dan tahap pertama b, malah == tidak diwujudkan.

    Selepas penyalinan dalam, beberapa nod asal a akan dikekalkan dan nod lepas b akan ditimpa atau ditambah, tetapi tiada hubungan rujukan dengan b, jadi mengubah suai mana-mana nod a tidak akan menjejaskan b. Ini sangat berguna apabila memproses beberapa data Untuk tidak menjejaskan data asal, perlu membuat salinan mendalam sebelum memproses data.

    Semasa salinan dalam, nombor indeks tatasusunan dianggap sebagai nama kunci, jadi elemen tatasusunan akan diubah suai dan bukannya ditambahkan pada data asal. Contohnya:

    var a = [
      {
        x: 1,
      }, 
      {
        x: 2,
      },
    ]
    var b = [
      {
        y: 2
      },
    ]
    $.extend(true, a, b) 

    Anda akan mendapat:

    var a = [
      {
        x: 1,
        y: 2
      }, 
      {
        x: 2,
      },
    ]

    Primitif pertama b digabungkan ke dalam elemen pertama a. Penggabungan ini adalah kerana tatasusunan beroperasi berdasarkan nombor indeks elemen sebagai kunci. Oleh itu, anda tidak boleh menggunakan extend untuk menggabungkan tatasusunan, tetapi anda harus mempertimbangkan untuk menggunakan cantum atau concat.

    balas
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:35:54

    Ia hanya pendua nama, ia tiada kaitan dengan salinan dalam/salinan cetek. Ia sepatutnya lebih sesuai dipanggil salinan rekursif.

    balas
    0
  • Batalbalas