2012-08-06 54 views
0

我正在寫一個HTML表單,如果輸入是一個數字,它會做一些簡單的計算。但是,我的號碼輸入不被javascript函數視爲一個數字。我很困惑,爲什麼會是這樣,並使用下面的代碼isNaN給出了令人困惑的結果

HTML

<form> 
<input name=a type=number value='' oninput='checka();'> 
<input name=b type=number value='' oninput='checkb(this);'> 
</form> 

的Javascript

function checka() { 
alert(isNaN(document.forms[0].a.value)); 
} 

function checkb(A) { 
alert(isNaN(this.value)); 
} 

我對結果目瞪口呆做了一些測試與jsFiddle。當輸入'5'時,checka函數正常工作,假如輸入'a',則爲真。但是,checkb函數在兩種情況下都是正確的。

我從Mozilla documentation明白isNaN功能可能會做類型轉換首先檢查是否由於輸入的是數字或不前:

混淆特殊情況的行爲

由於在非常早的版本isNaN函數規範, 其對非數字參數的行爲一直令人困惑。當isNaN函數的參數 不是數字時,該值首先被強制爲一個數字 。然後測試結果值以確定 是否爲NaN。因此,對於強制爲數字 類型的非數字,會生成有效的非NaN數值(特別是空字符串 和布爾基元,當強制給出數值0或 之一)時,「假」返回值可能會意想不到的;例如,空字符串 肯定「不是數字」。該混淆源於事實,即「不是數字」一詞對於表示爲IEEE-794浮點值的數字 具有特定含義。函數應該是 解釋爲回答問題,「是這個值,當強制爲 的數值時,IEEE-794的'非數字'值?」

這有助於解釋我所看到的現象嗎?或者這是另一種與類型轉換無關的混淆形式?

+0

難道你不是指在'checkb'中的'A.value'? – 2012-08-06 15:36:25

+0

啊,是的,我的錯。 – 2012-08-06 15:38:10

回答

8

this(當你調用checkb)是window ......

(你叫checkb(this)沒有父對象(foo.checkb)這樣的背景下是window自動。如需進一步閱讀,請How does 「this」 keyword work within a JavaScript object literal?

...等等this.valuewindow.value這是(推測)undefined,因此不是一個數字。

您不會對this執行任何操作,而是將其傳遞給checkb() - 該函數不會對其任何參數執行任何操作。

你大概的意思是:

function checkb(A) { 
alert(isNaN(A.value)); 
} 
+0

對不起,爲什麼'這個''window''而不是'input'? – 2012-08-06 15:36:46

+0

@QuestionOverflow - 查看編輯。 – Quentin 2012-08-06 15:38:42

+0

我很抱歉,我的錯誤,這是一個學校男孩的錯誤。 – 2012-08-06 15:39:36

1

this.value是不確定的,這是窗口對象,而不是輸入。

如果您想使用它來指向輸入,您需要以不顯眼的方式分配事件處理程序。

<form> 
<input name=b type=number value='' id="b"> 
</form> 

<script>  
function checkb(A) { 
    alert(isNaN(this.value)); 
}  
document.getElementById("b").oninput = checkb; //better to use an addEventListener 
</script>