ciao tutti e buon anno,
che differenza c'e' tra le dichiarazioni:
var s = "";
e
var s = new String ("");
?
ciao tutti e buon anno,
che differenza c'e' tra le dichiarazioni:
var s = "";
e
var s = new String ("");
?
Teoricamente nulla, visto che (una delle cose belle del js e dell' oop in generale) in js ogni tipo di dato è trattato come un oggetto, e ha i suoi metodi e proprietà, quindi anche una stringa è un oggetto.\n Fare in definitiva "new String()" o solo "" è dunque la stessa cosa dato che js riconosce il tipo di dato.
Antonio Correnti
www.resetstudio.it
In realtà una differenza c'è. Il tipo stringa è un tipo primitivo in javascript. Il metodo new String rende esplicito il fatto che la stringa deve essere trattata come oggetto.
Per accorgersi della differenza basta fare un test:
s.a sarà uguale ad undefined.codice:var s = ""; s.a = "a"; var s2 = new String(""); //Object("") è praticamente la stessa cosa s2.a = "a"; alert(s.a + s2.a);
Ma allora in questo caso facendo
s2.a="miao";
alert(s2);
l'alert mi restituisce [object Object]?
Mega, non ho provato ruby o java e per ora js è il linguaggio più ooOpOOp che conosco, e trovo funzionale che dopo aver creato una stringa con var x=""; accedo ai suoi metodi semplicemente tramite le sue api (es. x.replace()anche se tutti questi restituiscono un risultato invece di modificare una proprietà dell'oggetto...
Antonio Correnti
www.resetstudio.it
No, ti restituisce la stringa vuota in quanto s2 e' stata definita cosi' s2 = String("");Originariamente inviato da Erith
Ma allora in questo caso facendo
s2.a="miao";
alert(s2);
l'alert mi restituisce [object Object]?
Infatti l'oggetto stringa implementa il metodo toString che viene richiamato ogni volta tu fai l'alert di un oggetto.
Tale metodo e' rescrivibile ad esempio cosi'
Nel secondo caso alert(b) richiama implicitamente il metodo toString che ho ridefinito.codice:String.prototype.toString = function(){ return "Sono un tostring"; } a = "pippo"; b = new String("pluto"); alert(a); alert(b);
Ma a questo punto ho una domanda per mega:
perche' se creo un nuovo metodo per la classe String
Il nuovo metodo viene applicato anche alla variabile a? Insomma... a volte tratta la variabile a come oggetto e altre volte no... lo trovo un po' confuso... tu sai se c'e' una ragione?codice:String.prototype.prova = function(){ return "Sono un tostring"; } a = "pippo"; b = new String("pluto"); alert(a.prova()); alert(b.prova());
VVoVe: ...ops, ho acceso una bella discussione.
Mi sembra di essere scoiattolo Scrat in L'Era Glaciale con la sua ghianda!
VVoVe:
In effetti è una bella domanda
Il motivo è che ogni volta che tu usi l'operatore '.' , quello che è a sinistra dell'operatore viene trattato come oggetto.
Esempio:
quando io scrivo questo
e come se io scrivessicodice:String.prototype.a = "a"; var s = ""; alert(s.a);
in parole povere la chiamata alla funzione Object è sottintesa.codice:String.prototype.a = "a"; var s = ""; alert(Object(s).a);
E visto che la stringa viene trattata come oggetto, essa riceve automaticamente tutti i prototipi ( precisiamo che a riceverli non è s ma Object(s) ).
Forse ti chiederai ( forse non tu ma magari qualcun altro ): e perchè invece se aggiungo proprietà normalmente:
queste danno poi come valore undefined?codice:var s = ""; s.a = "a"; alert(s.a);
Per capirlo basta applicare la "regoletta" di prima:
come vedete io applico la proprietà non alla variabile s, bensì ad Object(s). E visto che tutti i valori primitivi, al contrario degli oggetti, vengono passati alle funzioni non per riferimento ma per valore, risulta a questo punto comprensibile il perchè quell'alert restituisca undefined.codice:var s = ""; Object(s).a = "a"; alert(Object(s).a);
Spero di essere stato utile![]()
Quindi quando uso l'operatore . fa il casting della variabile...
Sei stato non solo utile ma soprattutto molto chiaro
Ciao e grazie