2014-09-06 63 views
0

我想實現一個非常簡單的嘗試{}趕上{}塊,看起來像這樣:不明錯誤JavaScript語句

try{ 
    var invoice = parseInt(localStorage[0]); 
    if(invoice == NaN) 
     throw "invoice not a number"; 
    localStorage[invoice] = Ticket; 
    console.log("localStorage["+invoice+'] : '+localStorage[invoice]); 
    } 
    catch (e){ 
     console.log(e); 
     this.test(); 
    } 

我要做的就是手動清除localStorage的另一個功能,因此將localStorage [0]設置爲undefined。當我parseInt(localStorage [0]),它返回NaN,並將其存儲到發票。我在發票和NaN上使用了double equals條件,以防萬一,即使NaN是一個字符串(它不應該是),它也應該是真的。

我的問題是:爲什麼當我說「throw ...」時,它不會調用塊的catch部分?

當我運行下面的代碼,我得到了Chrome的控制檯輸出如下:

的localStorage [NaN的]:[目標對象]

它甚至不運行catch塊,事實上,即使在應該拋出異常之後,它仍然繼續運行try塊。

這是爲什麼?

回答

4

NaN不等於自己,使用isNaN

+0

這種行爲通常不公平地是「wtf javascript !!!」的目標。註釋。它實際上是在IEEE-754標準中爲JavaScript實現的浮點數定義的。 – joews 2014-09-06 14:30:53

+0

是的,真的!但感謝isNaN的善意。我們的先輩知道我們會在創造這個問題時遇到這個問題。不幸的是,他們沒有預見到一個人必須知道它對於這個人是有價值的! – papiro 2014-09-07 04:29:22