Newsgroup: it.comp.lang.javascript
Titolo: bug di mozilla

Salve,
Provate ad eseguire questo codice...
<script>
var s="aaa56iii";
function o() {
var d1=/\d+/gi.test(s);
var d2=/\d+/gi.test(s);
var d3=/\d+/gi.test(s);
var d4=/\d+/gi.test(s);
var d5=/\d+/gi.test(s);
return d1+d2+d3+d4+d5;
}
alert(o());
alert(o());
alert(o());
alert(o());
</script>
Si ottengono risultati inaspettati!
Saluti. Carlo.
-- 
Puoi chiamarmi con Skype, il mio id e' carlonike
Vuoi un sicuro e gratuito programma per la tua posta?
http://www.pegasusmail.tk
 o 
http://www.pmail.com

 Si ottengono risultati inaspettati!
Veramente sono proprio i risultati che mi aspetto, le cose che mi 
meravigliano sono altre:
1) che IE si comporti diversamente, anni fa mi sembrava che si 
comportasse come gli altri browser, ma posso sbagliare
2) Safari (su win) che si comporta come IE
Quello che tu chiami problema lo causi usando il flag "g", e qui non e' 
proprio necessario per il tuo scopo.
Per una spiegazione ti rimando a questo mio vecchissimo post:
http://tinyurl.com/5gs5pl
C'e' un esempio che dovrebbe chiarirti il tutto.

 Si ottengono risultati inaspettati!
il perché non lo so, comunque sia a naso centra l'oggetto RegExp che è
global.
Se crei prima ottieni il risultato corretto:
 var re=new RegExp();
 re=re.compile("\\d+","gi");
 var d1=re.test(s);
 var d2=re.test(s);
 var d3=re.test(s);
 var d4=re.test(s);
 var d5=re.test(s);
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 C'e' un esempio che dovrebbe chiarirti il tutto.
L'esempio era appunto un po' vecchio e nei miei primi tempi in js.
Sostituisci "arr.lastIndex" con "re.lastIndex"
O firefox ti sputera' un po' di undefined...

 proprio necessario per il tuo scopo.
Anche opera si comporta come Internet Explorer. L'unico che si comporta in modo
strano č proprio Mozilla.
Comunque resto dell'opinione che eseguire piů volte la stessa funzione senza
cambiare i dati dovrebbe dare gli stessi risultati.
Mi ha fatto diventare matto in un'applicazione...


 C'e' un esempio che dovrebbe chiarirti il tutto.
è venerdì sera e sò'dde'coccio, ma non ho capito ... forse perché non vedo
la domanda a cui hai risposto nel link.
-- 
"Run rabbit run
 dig that hole, forget the sun
 and when at last the work is done
 don't sit down, it's time to dig another one"
									    P.F.

 Mi ha fatto diventare matto in un'applicazione...
Ma i dati cambiano, e sei tu con quel flag "g" a farli cambiare.
Rileggi il mio vecchio post.

  var d5=re.test(s);
mi da 3!? ma non dovrebbe essere cinque?


 La mia versione di Opera (9.27) si comporta esattamente come Gecko.
È vero!


 mi da 3!? ma non dovrebbe essere cinque?
non direi ... prima 5 era dato da true+true+true+true+true, ora è dato da
true+false+true+false+true (come deve essere) ...


 restituirci i match successivi. 
Leggi qui:
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:RegExp:exec#Description
E questo vale anche per IE.
La questione nuova, perche' effettivamente c'e', la si vede qui 
(ripropongo esempio simile a quello di carlonike):
function pippo(){
     var s = "aaa56iii";
     var d1 = new RegExp("\\d+", "g").test(s);
     var d2 = /\d+/g.test(s);
     alert(d1 + " - " + d2);
};
pippo();
pippo();
In questo caso per gecko (e Opera) le regexp create con i letterali non 
sono equivalenti a quelle create col costruttore.
Con piu' calma ragiono sul comportamento, che' ora proprio non posso.

 sono equivalenti a quelle create col costruttore.
Esattamente, come esplicitato dalla guida (fa molto Douglas Adams,
detta cosě):
"Regular expression literals provide compilation of the regular
expression when the script is evaluated. When the regular expression
will remain constant, use this for better performance."
<
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Regular_
Expressions>
-- 
"Se c'č qualcosa di piů importante del mio ego su questa nave,
la voglio catturata e fucilata."

 Provate ad eseguire questo codice...
domanda: perche' utilizzi RegExp.test con un pattern globale senza
conoscerne gli effetti collaterali?
-- 
Piu' che ecoballe c'erano tante balle e basta.

 
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Regular_Expressions
Il venerdi' sera, per carita', picchia che e' una meraviglia.
Un qualcosa di nuovo, per me, c'e': non conoscevo / ricordavo quel 
comportamento scelto da gecko e opera. E non conoscevo / ricordavo di 
averlo letto nella reference.
Comunque rispondo anche agli altri visto che noi ci siamo poi sentiti 
per telefono.
A prima occhiata guardando il post di carlonike mi sono detto: ehi, il 
classico problema del flag "g".
Poi rileggendo il suo esempio mi sono accorto che la sua casistica era 
un poco piu' particolare.
Facendo due test il comportamento dei vari browser era ovvio, e l'ultimo 
esempio fatto a Cristiano voleva proprio mettere in evidenza questo.
Tuttavia non ricordavo proprio di aver letto qualcosa in proposito nelle 
reference; felice ora di sapere che e' documentato, preoccupato che mi 
sia sfuggito.
A parte tutto, mi permetto di dare un consiglio a carlonike e a chi 
leggera' questo: i "flag" nelle espressioni regolari vanno messi per un 
motivo.
Poi, per mia abitudine, non buona programmazione ma solo abitudine, uso 
sempre i corrispettivi metodi dell'oggetto String; a meno che non abbia 
proprio necessita' di sfruttare le differenze (come in un ciclo con 
match successivi).

 will remain constant, use this for better performance."
Perdindirindina, quasi mi dimenticavo di questo.
Se non ci metti di mezzo l'asciugamano non vale, ed e' troppo tardi 
perche' io faccia battute. Aspetto il Balestra al varco.

 esempio fatto a Cristiano voleva proprio mettere in evidenza questo.
sì, quello che intendevo dire è che il problema indicato (a dir la verità
l'OP non ha detto cosa secondo lui non andava) non era lo stesso che avevi
indicato
-- 
"Capivamo di essere tanti
 capivamo di essere forti,
 il problema era solamente
 come farlo capire ai morti."
									    C.L.