2016-02-01 61 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

相关问题