2012-04-13 28 views
0

我有以下函數,當change事件發生在input字段中的值時,我正在使用正則表達式匹配來檢查正確的日期格式。正則表達式的JS對象類型返回爲NaN

我的問題是month,dayyear返回爲NaN,我不知道爲什麼。我解析正則表達式對象[1][2][3]分別與parseInt(),所以我不知道他們爲什麼返回爲NaN

validateDate: function(event) { 

     var input = $(event.target); 
     var enteredDate = input.val(); 

     input.destroyValidationMessage(); 

     var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/; 
     var result = pattern.test(enteredDate); 

     if (result !== null) { 
      var month = parseInt(result[1], 10); 
      var day = parseInt(result[2], 10); 
      var year = parseInt(result[3], 10); 
     } 
    } 

回答

3

.test()[MDN]返回一個布爾值,即truefalse和只告訴你是否表達所述輸入相匹配或沒有。

而且,由於if(result !== null)始終是result真正被要麼truefalse,在if語句塊被執行。

match[x]true[x](或false[x])相同,而不是拋出錯誤,它返回undefined。這是因爲JavaScript在內部將原始值轉換爲對象,並且訪問不存在的屬性導致返回值undefined。另外,parseInt(undefined, 10)返回NaN


你想用.match()[MDN]

var result = enteredDate.match(pattern); 

數字字符串轉換爲一個數是使用一元+運營商的短方式:

var month = +result[1]; 

這給由於輸入字符串只包含數字,因此您在這裏得到相同的結果

+0

讀,我不知道是否'exec'或'測試()'是正確的。你能解釋爲什麼你選擇對exec進行測試嗎? – Brian 2012-04-13 14:19:21

+1

我用'match()',原因應該是顯而易見的:你不能用'test()'從輸入中提取數據。看看文檔。正確的方法是爲您提供所需結果的方法。 – 2012-04-13 14:21:20

2

您需要使用exec而不是test

var result = pattern.exec(enteredDate); 

更多關於EXEC你可以在MDN

+0

我不知道'exec'或'test()'是否正確。你能解釋爲什麼你選擇了超過測試嗎? – Brian 2012-04-13 14:19:09

+0

我已經更新了我的答案 – antyrat 2012-04-13 14:26:28