Visualizzazione dei risultati da 1 a 4 su 4

Discussione: domanda su eval

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    892

    domanda su eval

    Dunque: io volevo sostituire in una stringa tutte le occorrenze della seconda lettera con la prima (in pratica: leone mi diventava llonl). Mi è stato suggerito questo script, che funziona correttamente:

    codice:
    var parola="leone";
    replaced=parola.replace(eval('/'+parola.substr(1,1)+'/gi'),parola.substr(0,1));
    document.write(replaced);
    quello che non capisco è l'uso di eval: perché è necessario? A che serve e in quali casi va usato? Scusate la domanda banale...

  2. #2
    eval() è uno dei metodi "integrati" di JavaScript più potente. Ti permette di "valutare" un'espressione, anche molto complessa. Per "valutare" intendo che l'espressione all'interno delle parentesi di eval() (ovvero il suo argomento) viene prima eseguita fino al "risultato finale" e poi valutata. Ti faccio un es. pratico:

    codice:
    eval("document.Modulo.campo" + n);
    Questo semplice codice, in cui n è una variabile numerica, ti permette di identificare e quindi di utilizzare un oggetto (di tipo Object) della pagina partendo dalla concatenazione di una stringa e di una variabile. Se nella pagina hai un form chiamato "Modulo" in cui hai per es. 2 campi di testo chiamati "campo1" e "campo2", eval() ti permette con quel codice di identificare uno di essi in base al valore di n.
    Per prima cosa, viene eseguita l'espressione che eval() riceve come argomento. Questa espressione, nel caso di prima, è una semplice concatenazione. JavaScript esegue infatti la "somma" della stringa "document.Modulo.campo" con il valore di n (supponiamo sia 1). Dato che "document.Modulo.campo" è un oggetto di tipo String (stringa) JavaScript tenterà di convertirlo implicitamente in un numero per poterlo sommare al valore di n. Ovviamente non ci riuscirà, e quindi determinerà il "risultato" dell'espressione come una semplice concatenazione che origina la stringa "document.Modulo.campo1". A questo punto entra in gioco eval() che "valuta" questa stringa. eval() riconosce che si tratta del "percorso" che parte dall'oggetto document e che arriva all'oggetto campo1 (il primo dei tuoi campi di testo nel form). Per questo motivo, converte la semplice stringa in un "percorso" di oggetti (document, Modulo e campo1 sono tutti di tipo Object).
    Grazie ad eval() quindi, non hai più una stringa, ma un riferimento ad un oggetto della pagina (campo1). Ora che hai determinato l'oggetto a cui ti riferisci con eval(), puoi chiaramente utilizzarlo per diverse cose, come leggerne o impostarne il valore (value), ecc.
    Se tu, sempre nell'es. della pagina col form "Modulo" che contiene i campi "campo1" e "campo2", provavi a scrivere una cosa del genere:

    codice:
    n = 1;
    var oggetto = "document.Modulo.campo" + n;
    oggetto.value = "pippo";
    ottenevi un errore come: "'oggetto' è nullo o non è un oggetto". Questo perché non hai usato eval() quando dichiari la variabile oggetto. Per JavaScript, in un caso come questo, la variabile oggetto è di tipo String e contiene il valore "document.Modulo.campo1", non un riferimento all'oggetto campo1 della tua pagina. Anche impostare il valore di oggetto con oggetto.value generava un errore, perché value è una proprietà di alcuni oggetti (di tipo Object) e non delle stringhe.

    Nel tuo codice:

    codice:
    eval('/'+parola.substr(1,1)+'/gi')
    eval() "valuta" la concatenazione delle stringhe "/", parola.substr(1,1) (che è una stringa) e "/gi". Quindi quello che ritorna non è un oggetto di tipo String ("/SOTTOSTRINGA/gi") ma una regular expression, ovvero un oggetto regExp.

  3. #3
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    E' un modo, non troppo ortodosso, di creare una Regular Expression in modo implicito... in pratica questo:

    var parola="leone";
    RE = new RegExp(parola.substr(1,1),"gi");
    replaced=parola.replace(RE,parola.substr(0,1));
    document.write(replaced);

    ciao

    EDIT: scusa seed_squall_it, non avevo visto la tua risposta.
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  4. #4
    Figurati br1...non c'è problema!

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.