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

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.