一个错字最终变成
a.b > 0
,其中a.b
未定义。根据MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Greater_than_operator),比较会在操作数上调用.valueOf()
。所以应该是
a.b.valueOf() > 0
但是实际上会引发似乎没有发生的错误。相反,这似乎需要评估:
undefined > 0
我误会了吗?
就我而言,这导致了Node.js代码中的无提示错误。我当然希望抛出一个错误。
我可以在不显式检查操作数的情况下处理此问题吗?
编辑:freeCodeCamp似乎比MDN更正确地描述了这一点:
https://guide.freecodecamp.org/javascript/comparison-operators/
但是我仍然想知道最简单的处理方式而又不会被简单的错字困扰。
答案 0 :(得分:2)
请参见specification:is的作用:
- 让它成为执行抽象关系比较lval
其中does,它首先试图将双方强制转换为原始类型:
a。设px为? ToPrimitive(x,提示编号)。
b。让py是? ToPrimitive(y,提示编号)。
undefined
已经很原始了,没有东西抛出。然后,它会:
让nx是? ToNumeric(px)。
让我成为吗? ToNumeric(py)。
将undefined
投射到数字中也不会抛出,但是会返回NaN
:
console.log(Number(undefined));
所以我们开始
如果Type(nx)与Type(ny)相同,则返回Type(nx):: lessThan(nx,ny)。
其中nx
为NaN
,ny
为0。当lessThan
为undefined
时,nx
返回NaN
,描述{ {3}}:
- 如果x为NaN,则返回undefined。
然后返回到答案开头5.
之后的步骤:
- 如果r未定义,则返回false。否则,返回r。
结果为undefined
,因此返回false
(不会引发错误)。
应该是
a.b.valueOf() > 0
在valueOf
评估过程中(在上面的<
中,只有一个对象会被调用a. Let px be ? ToPrimitive(x, hint Number).
。 undefined
不是对象-它已经是原始对象,因此在此步骤中不会发生其他转换。
我当然希望抛出一个错误。
我可以在不显式检查操作数的情况下处理此问题吗?
并非如此,但这一点都不难-如果不确定,只需检查a.b
是否为数字。 if (typeof a.b === 'number')
。没关系。