2009-07-06 8 views
13

¿Por qué la RegExp /^\w+$/ coincide con undefined?

código Ejemplo:

alert(/^\w+$/.test(undefined)); 

Esto mostrará cierto en Firefox 3 (sólo navegador he comprobado en).

Respuesta

33

Cuando undefined se convierte en una cadena (lo que hace la expresión regular), produce la cadena "undefined", que luego se combina.

+2

Tiene sentido, aunque es un poco poco intuitivo. – cdmckay

+0

Tal vez un poco ... pero no hay un concepto real de excepciones o algo así en JavaScript, un poco de comportamiento peculiar es mejor que morir silenciosamente. –

+0

Bueno, hay errores (https://developer.mozilla.org/es/Core_JavaScript_1.5_Reference/Global_Objects/Error) ... – cdmckay

4
/(\w)(\w)(\w)(\w)(\w)/.exec(undefined); 

devuelve: ["undef", "u", "n", "d", "e", "f"]

Se está tratando definido como la cadena "undefined".

4

Consulte la sección de especificación ECMAScript 15.10.6.2 para RegExp.prototype.exec (cadena) que se llamará desde el método .match. match básicamente es ejecutivo cuando se evalúa como verdadero.

Aquí es palabra por palabra de la especificación: Realiza una comparación de expresión regular de la cadena contra la expresión regular y devuelve un objeto Array que contiene los resultados del partido, o null si la cadena no ha producido El String toString (cadena) se busca una ocurrencia del patrón de expresión regular de la siguiente manera:

  1. Sea S el valor de ToString (cadena).
  2. Deje que la longitud sea la longitud de S.
  3. Deje que lastIndex sea el valor de la propiedad lastIndex.
  4. Deje que yo sea el valor de ToInteger (lastIndex).
  5. Si la propiedad global es falsa, permita i = 0.
  6. Si I < 0 o I> length, establezca lastIndex en 0 y devuelva nulo.
  7. Llame a [[Match]], otorgándole los argumentos S y i. Si [[Match]] devolvió la falla, vaya al paso 8; de lo contrario, deje que r sea su resultado de estado y vaya al paso 10.
  8. Permita i = i + 1.
  9. Vaya al paso 6.
  10. Sea e be el valor endIndex de r.

Como puede ver, se traducirá cualquier entrada a una cadena, por lo indefinido se convierte en 'indefinido' y que coincidirá con verdadero.

Probó esto también fuera del navegador utilizando JScript en la línea de comandos y obteniendo el mismo resultado.

Cuestiones relacionadas