2009-07-06 50 views
13

爲什麼RegExp /^\w+$/匹配undefined

示例代碼:

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

(I測試了僅瀏覽器)這將顯示在Firefox 3真。

回答

33

undefined被轉換爲字符串(正則表達式)時,它會生成字符串"undefined",然後匹配。

+2

有意義,雖然這有點不直觀。 – cdmckay 2009-07-06 02:58:48

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

回報:["undef", "u", "n", "d", "e", "f"]

它是作爲字符串"undefined"處理不確定的。

4

請參閱ECMAScript規範第15.10.6.2節的RegExp.prototype.exec(字符串),它將從.match方法調用。當它被評估爲真時,匹配基本上是可執行的。

這裏是從說明書字字: 執行鍼對正則表達式串的正則表達式匹配,並返回包含匹配的結果Array對象,或空,如果該字符串不匹配 的字符串的ToString(字符串)搜索正則表達式模式的發生如下:

  1. 設S爲ToString(字符串)的值。
  2. 設長度爲S.的長度
  3. 讓lastIndex爲lastIndex屬性的值。
  4. 讓我成爲ToInteger(lastIndex)的值。
  5. 如果全局屬性爲false,則讓i = 0。
  6. 如果I < 0或I>長度,則將lastIndex設置爲0並返回null。
  7. 調用[[Match]],給它參數S和i。如果[[Match]]返回失敗,請轉至步驟8; 否則讓r爲其狀態結果並轉到步驟10.
  8. 讓i = i + 1。
  9. 轉到步驟6.
  10. 設e是r的endIndex值。

正如你所看到的,它會將任何輸入轉換爲一個字符串,所以undefined變成'undefined',並且將匹配爲true。

在命令行中使用JScript在瀏覽器外部測試此功能,並獲得相同的結果。