Visualizzazione dei risultati da 1 a 6 su 6

Discussione: array gemelli

  1. #1

    array gemelli

    Con una funzione js, creo 2 array che hanno nome diverso e sono identici per il resto.
    Quando modifico il valore di un elemento di uno degli array, modifico involontariamente e automaticamente anche l'elemento analogo dell'altro array.

    codice:
    <html>
    <head>
     <script type="text/javascript">
      datiOrigRelaz = new Array();
      datiNuoviRelaz = new Array();
      datiOrigStrade = new Array();
      datiNuoviStrade = new Array();
      function convertiStringa(cont,str)
       { 
       arra = new Array();
       ar = str.split(',,,');
       for (d=0; d<ar.length; d++)
        {
        arr = ar[d].split('---');
        arra[d] = arr[1];
        }
       if (cont == 'strade')
        {
        datiOrigStrade = arra;
        datiNuoviStrade = arra;
        }
       else
        {
        datiOrigRelaz = arra;
        datiNuoviRelaz = arra;
        }
       }
    
      function insInfoViaggio()
       {
       alert("Prima dell assegnazione di datiNuovi\n\nOrig : " + datiOrigStrade[3] + "\n\nNuovi : " + datiNuoviStrade[3] + "\n\ntesto nuovo : " + document.getElementById('cAnord').value + '+++' + document.getElementById('cAsud').value);
       datiNuoviStrade[3] = document.getElementById('cAnord').value + '+++' + document.getElementById('cAsud').value;
       alert("Dopo dell assegnazione di datiNuovi \n\nOrig : " + datiOrigStrade[3] + "\n\nNuovi : " + datiNuoviStrade[3]);
       }
     </script>
    </head>
    <body>
     <table>
      <tr>
       <td style='width:180px; text-align:right; vertical-align:top'>Come arrivare da ...</td>
       <td style='width:60px; text-align:right; vertical-align:top'>Nord</td>
       <td style='width:380px'>
        <textarea id='cAnord' rows='4' cols='38' style='margin-bottom:10px'>segui le indicazioni per La Pinetina</textarea>
       </td>
      </tr>
      <tr>
       <td></td>
       <td style='width:60px; text-align:right; vertical-align:top'>Sud</td>
       <td>
        <textarea id='cAsud' rows='4' cols='38'> sator arepo tenet opera rotas </textarea>
       </td>
      </tr>
      <tr>
       <td style='height:30px'></td>
      </tr>
      <tr>
       <td colspan='3' style='text-align:center'>
        <input type='button' value='prova' onclick="insInfoViaggio()" />
       </td>
      </tr>
     </table>
     <script type="text/javascript">
      convertiStringa('strade','id---2,,,coord_sat---45.030679° N 12.606113° E,,,settaggi_mappa---,,,come_ragg_4ruote---segui le indicazioni per La Pinetina+++sator arepo tenet opera rotas,,,come_ragg_4ruote_foto---incrocio_capannelle.jpg,,,come_ragg_2ruote---,,,come_ragg_2ruote_foto---,,,come_ragg_cielo---,,,come_ragg_cielo_foto---,,,come_ragg_mare---,,,come_ragg_mare_foto---,,,come_ragg_treno---,,,come_ragg_treno_foto---');
     </script>
    </body>
    </html>
    La magia avviene perchè assegno arra sia a datiOrigStrade che a datiNuoviStrade
    Qualcuno sa darmi una spiegazione tecnica???

  2. #2
    Semplicement sia datiOrigStrade che datiNuoviStrade che arra si riferiscono alla stessa locazione di memoria, ovvero si tratta dello stesso array.

    Facendo
    codice:
    datiNuoviStrade = arra
    non stai facendo una copia di arra, stai invece facendo in modo che datiNuoviStrade punti allo stesso array a cui punta arra. Se vuoi fare una copia di un array in javascript puoi fare:

    codice:
    datiNuoviStrade = arra.slice(0);
    max

    Silence is better than bullshit.
    @mmarcon
    jHERE, Maps made easy

  3. #3
    il tu ragionamento fila ..
    ma il caso dovrebbe ripetersi ad ogni assegnazione come datiOrigStrade = arra... invece m'è capitato per la prima volta
    poi la locazione di memoria viene assegnata al momento dell'inizializzazione di una variabile o array.. oppure js si comporta diversamente da java

  4. #4
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    Il punto è semplice. In JavaScript devi distringuere tra valori primitivi e oggetti (la vulgata secondo cui ogni cosa in JavaScript è un oggetto è falsa):

    codice:
    	Valori primitivi			Oggetti
    -----------------------------------------------------------------
    	String					Function
    	Number					Object
    	Boolean					null
    						undefined
    Qualsiasi tipo di dati è riconducibile a questa tabella, non si scappa. Un valore primitivo (tipi di dati rappresentati dalla colonna a sinistra) è un valore che viene di volta in volta ricopiato nel passaggio da una variabile all'altra. Un oggetto invece è un qualcosa di totalmente inaccessibile al codice JS, quello che c'è di visibile lo devi immaginare come una specie di "collegamento" (ed è quest'ultimo che viene ricopiato nel passaggio da una variabile all'altra).
    Il tutto puoi immaginarlo più o meno così. Fa' finta di avere una specie di "tabella" che simuli il comportamento dell'interprete. A sinistra hai il nome della variabile salvato dall'interprete e a destra hai il suo contenuto. Bene, quando crei un valore primitivo (una stringa per esempio):

    codice:
    var mioNome = "Mario Rossi";
    la tabella si riempirà così:

    codice:
    	Nome variabile				Contenuto
    -----------------------------------------------------------------
    	mioNome					String:Mario Rossi
    Quando invece crei un oggetto le cose si complicano. Fa' finta di dover creare un array:

    codice:
    var animali = ["Cane", "Gatto", "Topo", "etc.", "etc."];
    Bene, per prima cosa l'interprete si crerà un oggetto per fatti suoi e gli darà un indirizzo per accedere che chiameremo, per esempio, ABCDEFGH. Poi assegnerà alla tua variabile quest'indirizzo.

    codice:
    // operazione interna all'interprete:
    // Obj:ABCDEFGH = ["Cane", "Gatto", "Topo", "etc.", "etc."];
    
    	Nome variabile				Contenuto
    -----------------------------------------------------------------
    	animali					Obj:ABCDEFGH
    Fin qui nulla ci tange, potremmo benissimo ignorare cosa fa l'interprete. La cosa però si farà palese nel momento in cui copiamo il contenuto della variabile. Immaginiamo di lanciare una copia di entrambe le nostre variabili:

    codice:
    var copiaNome = mioNome;
    var copiaAnimali = animali;
    Come si comporterà l'interprete? Bene, questo sarà il risultato:


    codice:
    	Nome variabile				Contenuto
    -----------------------------------------------------------------
    	mioNome					String:Mario Rossi
    	animali					Obj:ABCDEFGH
    	copiaNome				String:Mario Rossi
    	copiaAnimali				Obj:ABCDEFGH
    La conseguenza più immediata e intuitiva ti tutto ciò è che: modificare il contenuto di un valore primitivo significa modificare il contenuto di una variabile, mentre invece, modificare il contenuto di un oggetto significa lasciare inalterato il contenuto di una variabile (Obj:ABCDEFGH nel nostro esempio); inoltre, per rispondere alla tua domanda, assegnare un nuovo valore a una variabile contenente un oggetto significa abbandonare il vecchio "collegamento" (perdendolo del tutto se non è salvato in qualche altra variabile). Inoltre un valore primitivo non occupa altra memoria se non quella occupata dalla variabile stessa, mentre invce un oggetto si trova in un posto a parte gestito dall'interprete diverso dalla variabile stessa.

    P.S. Questo ti fa capire perché se aggiungi un nuovo elemento all'array "animali" si modificherà anche l'array "copiaAnimali": entrambe le variabili contengono un collegamento allo stesso oggetto!

    Spero di essere stato esaustivo.

  5. #5
    che dire.. con spiegazione tecnia intendevo proprio questo.. grassie mille

    sicchè so stato fottuto dai collegamenti valore - nome .. maremma somara!

    se volessi saperne di più dovrei fare cosa??? cercare che?

    ah .. sono già passato in chiesa per accendere un cero a te, carlomarx

  6. #6
    Utente di HTML.it L'avatar di carlomarx
    Registrato dal
    Oct 2009
    Messaggi
    1,669
    @moderatori
    Il messaggio dell'utente seibert (che sta infestando il forum) contiene un virus. Se andate a vedere il sorgente, l'utente ha inserito questo codice:

    codice:
    [IMG]http://www.jpopo.info/g.gif[/IMG]
    E l'immagine "http://www.jpopo.info/g.gif" a me risulta essere un virus...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.