var i=0;
var a={};
console.log(i*a);
console.log(0*{});
console.log({}*{});
結果爲NaN,NaN的不同,NaN爲什麼使用Javascript允許算術非數字
Ofcourse這不能丟,因爲JS的動態natue的語法錯誤,但爲什麼不這樣至少拋出運行時錯誤?試圖從這發現一個錯誤花了我〜15分鐘。不會拋出異常總是可取的嗎?
var i=0;
var a={};
console.log(i*a);
console.log(0*{});
console.log({}*{});
結果爲NaN,NaN的不同,NaN爲什麼使用Javascript允許算術非數字
Ofcourse這不能丟,因爲JS的動態natue的語法錯誤,但爲什麼不這樣至少拋出運行時錯誤?試圖從這發現一個錯誤花了我〜15分鐘。不會拋出異常總是可取的嗎?
爲什麼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")
爲什麼它不會導致轉換失敗?解析函數會拋出異常,爲什麼這是不同的? – Khlorghaal
@Khlorghaal:哪些解析函數會拋出異常? – Bergi
哎呀,我太習慣於那些都是這樣的理智語言:/ – Khlorghaal
它不讀this部分11.5.1應用*操作(第一點)
如果操作數是NaN,那麼結果是NaN
改正它不會引發異常。但爲什麼不呢? – Khlorghaal
@Khlorghaal我的意思是它不允許乘法。 – gurvinder372
「允許」在某種意義上不會拋出異常,產生影響可能傳播的結果。 – Khlorghaal
這就是JS的設計工作。這是否可取,幾乎是一種意見。等一等,前面會變得更糟,除以零也會產生'NaN'。 – Teemu
你期望'1/0'也會拋出錯誤嗎?或'0/0'? – Bergi
@Teemu我不知道爲什麼NaN在這種情況下被認爲是'壞' - 儘管這可以解釋是因爲JavaScript中的所有*數字都是IEEE-754浮點數,並且它使用非信號NaN:} – user2864740