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