2016-02-01 59 views
3
var i=0; 
var a={}; 
console.log(i*a); 
console.log(0*{}); 
console.log({}*{}); 

結果爲NaN,NaN的不同,NaN爲什麼使用Javascript允許算術非數字

Ofcourse這不能丟,因爲JS的動態natue的語法錯誤,但爲什麼不這樣至少拋出運行時錯誤?試圖從這發現一個錯誤花了我〜15分鐘。不會拋出異常總是可取的嗎?

+0

這就是JS的設計工作。這是否可取,幾乎是一種意見。等一等,前面會變得更糟,除以零也會產生'NaN'。 – Teemu

+0

你期望'1/0'也會拋出錯誤嗎?或'0/0'? – Bergi

+0

@Teemu我不知道爲什麼NaN在這種情況下被認爲是'壞' - 儘管這可以解釋是因爲JavaScript中的所有*數字都是IEEE-754浮點數,並且它使用非信號NaN:} – user2864740

回答

1

爲什麼JS允許使用非數字值的算術?

,因爲有可以轉換爲數字隱含值:

new Number(15) + "7" * {valueOf() { return 2 }} // 29 

爲什麼JS允許與NaN算法,而不扔?

因爲NaN值是一個數字,它的目的就是無差錯地進行錯誤傳播(這對控制流來說非常困難)。此行爲與其他使用浮點值的語言相同。

現在,如果轉換爲數字導致NaN,他們仍然可以例外,但由於它不允許有目的地使用類似new Number(NaN)之類的內容,因此它們不一致。如果你想要這樣的行爲,你仍然可以擁有它:

class MyNumber { 
    constructor (x) { 
     this.value = Number(x); 
    } 
    valueOf() { 
     if (typeof this.value != "number" || isNaN(this.value)) 
      throw new TypeError("not exactly a number"); 
     return this.value; 
    } 
} 

new MyNumber(15) * new MyNumber("areadfsdf") 
+0

爲什麼它不會導致轉換失敗?解析函數會拋出異常,爲什麼這是不同的? – Khlorghaal

+0

@Khlorghaal:哪些解析函數會拋出異常? – Bergi

+0

哎呀,我太習慣於那些都是這樣的理智語言:/ – Khlorghaal

0

它不讀this部分11.5.1應用*操作(第一點)

如果操作數是NaN,那麼結果是NaN

+0

改正它不會引發異常。但爲什麼不呢? – Khlorghaal

+0

@Khlorghaal我的意思是它不允許乘法。 – gurvinder372

+0

「允許」在某種意義上不會拋出異常,產生影響可能傳播的結果。 – Khlorghaal

相關問題