Tengo algunas líneas de código javascript como se muestra a continuación:

var str = '////';
var re = /^\/+$/g 
console.log(str && re.test(str), str && !re.test(str)); 

La salida del código en Node.js es false, false y en Chrome El lado del cliente es true, true

Estoy bastante confundido y alguien me ayudaría a entender:

  1. ¿Por qué las dos declaraciones booleanas se evalúan como true o false mientras se supone que son opuestas?
  2. ¿Cuál es la diferencia entre Chrome y Node.js al evaluar las dos declaraciones booleanas?
1
Lee 17 oct. 2018 a las 05:29

2 respuestas

La mejor respuesta

De MDN (el énfasis es mío) :

Al igual que con exec() (o en combinación con él), test() llamó a múltiples tiempos en la misma instancia de expresión regular global pasarán el partido anterior.

Entonces, dado que su expresión regular es global, sucede lo siguiente:

var str = '////';
var re = /^\/+$/g;

console.log(re.test(str)); // "true" — matches and regex advances
console.log(re.test(str)); // "false" — remainder no longer matches

En comparación, para una expresión no global:

var str = '////';
var re = /^\/+$/;

console.log(re.test(str)); // matches, "true"
console.log(re.test(str)); // matches, "true"

Nota: para el código de su pregunta, obtengo el mismo resultado en Node que en Chrome y en Firefox: true true.

0
Robby Cornelissen 17 oct. 2018 a las 02:50

Creo que no parece ser una respuesta, pero Node.js da como resultado:

true true

Aquí hay una consola de terminal.

PS E:\DevRoom\Kindy> node
> str = '////'
'////'
> re = /^\/+$/g
/^\/+$/g
> console.log(str && re.test(str), str && !re.test(str))
true true
undefined
>

enter image description here

Apuesto a que proviene de reutilizar la expresión regular global en consecuencia.

var regex1 = RegExp('foo*');
var regex2 = RegExp('foo*','g');
var str1 = 'table football';

console.log(regex1.test(str1));
// expected output: true

console.log(regex1.test(str1));
// expected output: true

console.log(regex2.test(str1));
// expected output: true

console.log(regex2.test(str1));
// expected output: false
1
Ali David 17 oct. 2018 a las 02:45