Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di eng
    Registrato dal
    Mar 2002
    Messaggi
    1,227

    [JS] differenze dichiarazione variabili

    ciao tutti e buon anno,
    che differenza c'e' tra le dichiarazioni:

    var s = "";

    e

    var s = new String ("");

    ?

  2. #2
    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

  3. #3
    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:
    codice:
    var s = "";
    s.a = "a";
    var s2 = new String(""); //Object("") è praticamente la stessa cosa
    s2.a = "a";
    alert(s.a + s2.a);
    s.a sarà uguale ad undefined.

  4. #4
    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

  5. #5
    Originariamente inviato da Erith
    Ma allora in questo caso facendo

    s2.a="miao";

    alert(s2);

    l'alert mi restituisce [object Object]?
    No, ti restituisce la stringa vuota in quanto s2 e' stata definita cosi' s2 = String("");

    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'

    codice:
    String.prototype.toString = function(){
           return "Sono un tostring";
    }
    a = "pippo";
    b = new String("pluto");
            
    alert(a);
    alert(b);
    Nel secondo caso alert(b) richiama implicitamente il metodo toString che ho ridefinito.

    Ma a questo punto ho una domanda per mega:

    perche' se creo un nuovo metodo per la classe String
    codice:
    String.prototype.prova = function(){
        return "Sono un tostring";
    }
    a = "pippo";
    b = new String("pluto");
    alert(a.prova());
    alert(b.prova());
    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?

  6. #6
    Utente di HTML.it L'avatar di eng
    Registrato dal
    Mar 2002
    Messaggi
    1,227
    VVoVe: ...ops, ho acceso una bella discussione.
    Mi sembra di essere scoiattolo Scrat in L'Era Glaciale con la sua ghianda!
    VVoVe:

  7. #7
    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
    codice:
    String.prototype.a = "a";
    var s = "";
    alert(s.a);
    e come se io scrivessi
    codice:
    String.prototype.a = "a";
    var s = "";
    alert(Object(s).a);
    in parole povere la chiamata alla funzione Object è sottintesa.
    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:
    codice:
    var s = "";
    s.a = "a";
    alert(s.a);
    queste danno poi come valore undefined?
    Per capirlo basta applicare la "regoletta" di prima:
    codice:
    var s = "";
    Object(s).a = "a";
    alert(Object(s).a);
    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.
    Spero di essere stato utile

  8. #8
    Quindi quando uso l'operatore . fa il casting della variabile...

    Sei stato non solo utile ma soprattutto molto chiaro

    Ciao e grazie

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 © 2025 vBulletin Solutions, Inc. All rights reserved.