PDA

View Full Version : [JavaScript] Domanda facile


vendettaaaaa
03-10-2013, 10:45
<!DOCTYPE html>
<html>
<body>

<h1>My First JavaScript</h1>

<p id="yo">Please input a number.</p>

<input id="demo" type="text">

<script>
function myFunction()
{
var x=document.getElementById("demo").value;
if(x==""||isNaN(x))
{
alert("Not Numeric");
return;
}
var v = document.getElementById("yo");
v.innerHTML = "PD";
}
</script>

<button type="button" onclick="myFunction()">Click Me!</button>

</body>
</html>

Questo codice funziona, ma perchè se cambio la parte in grassetto con questo:
var v = document.getElementById("yo").innerHTML;
v = "PD";
Non funziona?? Cioè, perchè var v può essere bindata ad un oggetto dom ma non ad una sua proprietà???

wingman87
03-10-2013, 11:39
Se si potesse fare quello che dici tu, allora servirebbe un metodo alternativo per leggere il valore di una proprietà, intendo a livello di linguaggio.
var v = document.getElementById("yo").innerHTML;
v = "PD";
Nella prima riga stai accedendo alla proprietà innerHTML in lettura, ottenendo il valore e mettendolo in v. Nella seconda stai sovrascrivendo il valore contenuto in v.

var v = document.getElementById("yo");
v.innerHTML = "PD";
Qui invece prima ottieni il riferimento all'oggetto, poi accedi alla proprietà in scrittura.

vendettaaaaa
03-10-2013, 11:57
Quindi, parlando in C++ese visto che vengo da linguaggi compilati, gli oggetti non si copiano, si passano solo per reference, mentre le loro proprietà si copiano per valore, correct?
Sarebbe

string v = document.getElementById("yo").innerHTML;
v = "PD";

versus

DOMHeader& v = document.getElementById("yo");
v.innerHTML = "PD";

wingman87
03-10-2013, 12:27
C++ non lo conosco mi dispiace... :(
Comunque secondo me sta storia del passaggio per reference o per valore è l'invenzione di qualcuno che pensava di rendere la cosa più comprensibile ai suoi studenti e invece ha generato un sacco di confusione... Non mi sto riferendo al C++, magari lì ha senso, ma penso a Java, C#, Javascript... O forse è l'eredità del C++ portata negli altri linguaggi ma secondo me se ne fa volentieri a meno.

Il passaggio è sempre per valore, ma a volte il valore è un riferimento, altre volte è un valore primitivo. Nel tuo caso anche InnerHtml contiene un riferimento, ad un oggetto String in particolare, ma esso è immutabile e come tale non lo puoi modificare tramite i suoi metodi e proprietà. Quindi lo sovrascrivi, però non stai sovrascrivendo InnerHtml, ma il riferimento all'oggetto a cui esso (InnerHtml) puntava che avevi salvato nella tua variabile.
Invece nel caso funzionante, ottieni il riferimento ad un oggetto mutabile e tramite la sua proprietà InnerHtml lo modifichi. In questo caso il riferimento non cambia e quindi stai agendo sullo stesso oggetto da cui hai ottenuto il riferimento ad InnerHtml.

C++ un po' l'avevo studiato ma su un libro delle balle e infatti non ho mai capito come funziona lì la copia di oggetti o il passaggio per valore o riferimento... Non mi ricordo nemmeno quel poco che avevo capito, ma un giorno mi piacerebbe colmare la lacuna :D

vendettaaaaa
03-10-2013, 13:00
Allora è come in C#, gli oggetti complessi (class in C#) sono passati/copiati sempre per riferimento, gli oggetti semplici (struct in C#) sono copiati per valore...ho capito cmq, grazie :D