a.b <0,当a.b === undefined时为什么不抛出错误?

问题描述 投票:0回答:1

一个错别字结尾为

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/

但是我仍然想知道最简单的方法来处理它而不被简单的错别字所困。

javascript node.js comparison throw operands
1个回答
1
投票

请参见specification:它的作用is

  1. 让成为执行抽象关系比较的结果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)。

[nxNaNny为0。lessThanundefinednx时返回NaN,如here所述:

  1. 如果x为NaN,则返回undefined。

然后返回到答案开头5.之后的步骤:

  1. 如果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')。没问题。

© www.soinside.com 2019 - 2024. All rights reserved.