一个错别字结尾为
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/
但是我仍然想知道最简单的方法来处理它而不被简单的错别字所困。
请参见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
,如here所述:
- 如果x为NaN,则返回undefined。
然后返回到答案开头5.
之后的步骤:
- 如果r未定义,则返回false。否则,返回r。
结果为undefined
,因此返回false
(不会引发错误)。
在应该这样
a.b.valueOf() > 0
valueOf
评估过程中(在上述<
中),仅object会调用a. Let px be ? ToPrimitive(x, hint Number).
。 undefined
不是对象-它已经是原始对象,因此该步骤不会发生其他转换。
我当然希望引发错误。
我可以在不显式检查操作数的情况下处理此问题吗?
并非如此,但这一点也不难-如果不确定,只需先检查a.b
是否为数字。 if (typeof a.b === 'number')
。没问题。