var i=0;
var a={};
console.log(i*a);
console.log(0*{});
console.log({}*{});
结果NaN,NaN,NaN
当然,由于js的动态natue,这不能抛出语法错误,但为什么这至少不会引发运行时错误?试图从中找到一个错误花了我大约15分钟。总是不希望抛出异常吗?
答案 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