Newsgroup: it.comp.lang.javascript
Titolo: Assegnare o referenziare, questo è il problema!

Ho notato che in JS c'è un comportamento "anomalo" dell'operatore '='.
A volte assegna, altre volte referenzia.
Lo stesso accade, così almeno mi sembra, anche in Flash.
In pratica, questo codice:
	myObj = document.getElementById('myObj'); // referenzia
	myObj.innerHTML = 'Ciao mondo!';
modifica il contenuto di un <div id='myObj'> contenuto nella pagina html
mentre un codice come questo:
	myObjIH = document.getElementById('myObj').innerHTML; // assegna
	myObjIH = 'Ciao mondo!';
NON modifica il contenuto di quel <div>.
(non ho provato, ma ricordo che dovrebbe essere così)
In pratica, pare che '=' referenzi quando alla sua destra c'è un
"oggetto" (?), e assegni quando c'è "solo" una proprietà (o altro).
E' così che funziona?
Ha per caso un nome questa tecnica? (così cerco con google)
Se io nel primo caso volessi assegnare e nel secondo referenziare?
Secondo voi, non sarebbe stato meglio prevedere sempre l'utilizzo
dell'operatore '&' per referenziare e '=' per assegnare?
Saluti, Maurizio
ps. ricordo che un tempo VB veniva deriso, tra l'altro, anche perchè '='
era anche l'operatore di confronto: qui non avviene la stessa cosa, anzi
ancor più "subdola", con un operatore che ha due funzioni?

 "oggetto" (?), e assegni quando c'è "solo" una proprietà (o altro).
Referenzia gli oggetti, e passa per valore gli altri tipi (in questo caso  
una stringa).
Questo comportamento "anomalo" è stato adottato dalla versione 5 di php ed  
è stato perfino pubblicizzato.
Se da un lato effettivamente il comportamento dell'assegnazione non è  
omogeneo d'altro canto questo è l'uso comune per gli oggetti e in genere  
uno si aspetta che le cose funzionino proprio così.
Quanto a deridere VB, mi lascia perplesso. Ogni linguaggio ha la propria  
sintassi e fine. Se è il contesto a decidere il comportamento di "=", ben  
venga. In fondo anche <? while( $record = mysql_fetch_array($r) ) ?> ,  
guardandolo bene, è codice strano.
Tac
-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/mail/

 (non ho provato, ma ricordo che dovrebbe essere cosě)
Certamente no, non lo modifica: prima assegni alla variabile myObjIH il 
valore della proprieta' innerHTML dell'oggetto, poi assegni alla 
variabile un nuovo valore e non stai certo dicendo di modificare la 
proprieta' dell'oggetto in questione.
Per modificare il contenuto devi, come sopra, assegnare un valore alla 
proprieta'.
Quindi avendo:
var myObjIH = 'Ciao mondo!';
puoi fare:
document.getElementById('myObj').innerHTML = myObjIH;

 le modifiche al testo non hanno effetto sul testo da cui l'hai copiato.
No, non c'entra veramente nulla.
Il nocciolo del discorso dell'OP, non č legato a questo, č a monte, a
prescindere se va ad assegnare un riferimento o un valore.
Per spiegarmi meglio, riprendendo il discorso il codice dell'OP:
	myObj = document.getElementById('myObj'); // referenzia
	myObj.innerHTML = 'Ciao mondo!';
	myObjIH = document.getElementById('myObj').innerHTML; // assegna
	myObjIH = 'Ciao mondo!';
E' la base del confronto che č sbagliata.
Il paragone sarebbe dovuto essere cosě:
	myObj = document.getElementById('myObj');
	myObj = document.createElement('div');
E se cosě facendo JS fosse andato a modificare effettivamente il DOM,
allora l'OP avrebbe avuto ragione da vendere a parlare di "anomalie".
Ovviamente cosě non č.
Il punto č che se dici a una variabile di riferirsi ad altro, non vai
certo a modificare ciň a cui si riferiva prima.
-- 
~ ..ma in effetti il  concetto di WYSIWYG (quello che vedi č quello
che ottieni) si applica ai computer malissimo, cosě  come si applica
alle  donne... (The  Real Programmer)

 le modifiche al testo non hanno effetto sul testo da cui l'hai copiato.
No, non c'entra veramente nulla.
Il nocciolo del discorso dell'OP, non č legato a questo, č a monte, a
prescindere se va ad assegnare un riferimento o un valore.
Per spiegarmi meglio, riprendendo il codice dell'OP:
	myObj = document.getElementById('myObj'); // referenzia
	myObj.innerHTML = 'Ciao mondo!';
	myObjIH = document.getElementById('myObj').innerHTML; // assegna
	myObjIH = 'Ciao mondo!';
E' la base del confronto che č sbagliata.
Il paragone sarebbe dovuto essere cosě:
	myObj = document.getElementById('myObj');


 ancor più "subdola", con un operatore che ha due funzioni?
a proposto di operatori subdoli con più funzioni.. non hai visto * e &
in c++ :)
--
Ciao
Blue

 che è quel che ho detto nella tera riga di esempio e ripetuto in fondo.
Se hai letto tutto il mio post, no, non hai detto questo.
Ti riferisci (erroneamente) a "puntatori", e a differenze tra 
assegnazione tra quelli e del "testo"; e non è questa la cosa
che discrimina il comportamento di JS in questo caso.
La questione è a monte, come ho scritto. Otterresti lo stesso
comportamento anche con un "puntatore" (brr).
-- 
~ "Io non vorrei subire un'ingiustizia nè commetterla, ma se
dovessi scegliere, preferirei subirla."
(Platone - "Gorgia")

 valore del puntatore che si sta passando,
Cosa fa o meno lo script engine non ci deve interessare, a meno che la
discussione non sia proprio su tale argomento.
Noi dobbiamo rimanere a livello di JS, poi come effettivamente vengono
implementate le specifiche di javascript, varia da engine a engine.
Non ci sono grandi certezze. Tant'è che molte delle considerazioni che
faresti su altri linguaggi in JS non "funzionano", soprattutto per ciò
che riguarda l'ottimizzazione.
Ma questo è un altro discorso.
-- 
~ "E' bello essere vivi.
Ci sono tante cose che non si possono fare da morti."

 evidentemente abbiamo un approccio diverso :-)
Secondo il tuo approccio, allora, dovremmo direttamente ragionare in
termini di Assembly, quantomeno. Ciò è errato.
Le specifiche servono appunto a questo:
A sapere cosa il linguaggio fa senza dover necessariamente studiarsi
"come" lo fa, su ogni singola implementazione.
A meno che, ripeto, ciò non sia proprio lo scopo che uno si pone.
Comunque sia, hai quotato l'unica cosa che con tutto il discorso non
c'entrava proprio nulla. :)
-- 
~ "Ho avuto la fortuna di unire mestiere e passione,
che secondo Stendhal equivale alla felicità."
(Roland Barthes)