2009-07-06 12 views
13

Dlaczego RegExp /^\w+$/ pasuje do undefined?

Przykładowy kod:

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

To pokaże prawdziwe w Firefoksie 3 (tylko przeglądarki Testowałem go).

Odpowiedz

33

Po odlaniu undefined na łańcuch (który wykonuje wyrażenie), powstaje ciąg znaków "undefined", który jest następnie dopasowywany.

+2

Ma sens, choć jest nieco nieintuicyjny. – cdmckay

+0

Być może trochę ... ale w JavaScript nie ma prawdziwego pojęcia wyjątków lub czegoś podobnego, trochę dziwaczne zachowanie jest lepsze niż umieranie w ciszy. –

+0

Cóż, są błędy (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error) ... – cdmckay

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

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

To jest traktowanie niezdefiniowane jako ciąg "undefined".

4

Zobacz rozdział Specyfikacja ECMAScript 15.10.6.2 dla RegExp.prototype.exec (string), który będzie wywoływany z metody .match. Dopasowanie w zasadzie jest exec, gdy jest oceniane na true.

Oto słowo po słowie od specyfikacji: Wykonuje Dopasowanie wyrażenia regularnego sznurka z wyrażenia regularnego i zwraca obiekt Array zawierający wyniki meczu, lub null, jeśli ciąg nie pasuje toString String (ciąg) jest wyszukiwane w celu wystąpienia wzorca regularnego wyrażenia w następujący sposób:

  1. Niech S będzie wartością ToString (ciąg).
  2. Niech długość będzie równa długości S.
  3. Niech lastIndex będzie wartością właściwości lastIndex.
  4. Niech ja będę wartością ToInteger (lastIndex).
  5. Jeśli właściwość globalna ma wartość false, niech i = 0.
  6. Jeśli I < 0 lub I> length, ustaw dla lastIndex wartość 0 i zwróć wartość null.
  7. Zadzwoń [[Dopasuj]], podając argumenty S i i. Jeśli [[Dopasuj]] zwrócił błąd, przejdź do kroku 8; inaczej niech r będzie wynikiem jego stanu i przejdź do kroku 10.
  8. Niech i = i + 1.
  9. Przejdź do kroku 6.
  10. Niech e będzie wartością endIndex.

Jak widać, przetłumaczy dowolne dane wejściowe na ciąg, więc niezdefiniowane stanie się "niezdefiniowane", a to będzie zgodne z prawdą.

Przetestowano to również poza przeglądarką, używając JScript w wierszu poleceń i uzyskując ten sam wynik.

Powiązane problemy