为什么Javascript允许非数字算术

时间:2016-02-01 17:45:51

标签: javascript operators

var i=0;
var a={};
console.log(i*a);
console.log(0*{});
console.log({}*{});

结果NaN,NaN,NaN

当然,由于js的动态natue,这不能抛出语法错误,但为什么这至少不会引发运行时错误?试图从中找到一个错误花了我大约15分钟。总是不希望抛出异常吗?

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

没有,请阅读this部分11.5.1应用*运算符(第一个项目符号点)

  

如果任一操作数是NaN,则结果为NaN