Al giorno d'oggi, le risposte qui riportati non sono del tutto complete/corretta.
A partire dal ES5, il comportamento della sintassi letterale è lo stesso di creazione per quanto riguarda oggetto RegExp()
sintassi: entrambi crea un nuovo oggetto RegExp ogni volta percorso di codice colpisce un'espressione in cui si stanno prendendo parte.
Pertanto, l'unica differenza tra i due ora è come capita spesso che regexp viene compilato:
- Con la sintassi letterale - una volta durante l'analisi di codice iniziale e compilazione
- Con
RegExp()
sintassi - ogni volta viene creato un nuovo oggetto
Si veda, ad esempio, Stoyan Stefanov's JavaScript Patterns libro:
Un'altra distinzione tra l'espressione regolare letterale e il costruttore è che il letterale crea un oggetto solo una volta durante fase di analisi. Se crei la stessa espressione regolare in un ciclo, l'oggetto creato in precedenza verrà restituito con tutte le sue proprietà (come lastIndex) già impostate dalla prima volta. Si consideri l'esempio seguente come un'illustrazione di come lo stesso oggetto è restituito due volte.
function getRE() {
var re = /[a-z]/;
re.foo = "bar";
return re;
}
var reg = getRE(),
re2 = getRE();
console.log(reg === re2); // true
reg.foo = "baz";
console.log(re2.foo); // "baz"
Questo comportamento è cambiato nel ES5 e letterale crea anche nuovi oggetti. Il comportamento è stato corretto anche in molti ambienti del browser , quindi non è possibile fare affidamento su di esso.
Se si esegue questo esempio in tutti i browser moderni o NodeJS, si ottiene la seguente invece:
false
bar
Il che significa che e molto tempo si sta chiamando la funzione getRE()
, un nuovo oggetto RegExp
viene creato anche con l'approccio di sintassi letterale.
L'spiega sopra, non solo perché non si dovrebbe usare la RegExp()
per espressioni regolari immutabili (è ben noto problema di prestazioni di oggi), ma spiega anche:
(io sono più sorpreso che inlineRegExp e storedRegExp hanno diversi risultati)
Il storedRegExp
è di circa 5 - 20%. cento più veloce di tutti i browser inlineRegExp
perché non c'è sovraccarico di creare (e di raccolta dei rifiuti) una nuova vigilia RegExp
oggetto ry time.
Conclusione:
creare sempre le espressioni regolari immutabili con la sintassi letterale e la cache è se è di essere ri-usato.In altre parole, non fare affidamento su questa differenza di comportamento in envs al di sotto di ES5 e continuare a eseguire il caching in modo appropriato in envs sopra.
Perché sintassi letterale? Essa ha alcuni vantaggi rispetto alla sintassi costruttore:
- è più breve e non ti costringono a pensare in termini di classe simile costruttori.
- Quando si utilizza il costruttore
RegExp()
, è inoltre necessario evitare le virgolette e le barre di escape doppie. Rende le espressioni regolari difficili da leggere e comprendere per loro natura ancora più difficile.
(citazione libera dallo stesso Stoyan Stefanov's JavaScript Patterns libro).
Quindi, è sempre una buona idea attenersi alla sintassi letterale, a meno che l'espressione regolare non sia nota al momento della compilazione.
È positivo che la versione "in linea" sia più veloce, poiché è molto meno brutta rispetto all'utilizzo del costruttore esplicito. – Pointy
Per esempio, potresti aver sovrascritto 'RegExp' in modo che a) debba cercare la funzione invece di valutarla direttamente, e b) la seconda possa essere valutata in fase di analisi mentre la prima non può perché la chiamata di' RegExp' può avere effetti collaterali nel caso in cui l'hai sovrascritto. – pimvdb