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

时间:2019-10-30 01:31:27

标签: javascript node.js comparison throw operands

一个错字最终变成

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/

但是我仍然想知道最简单的处理方式而又不会被简单的错字困扰。

1 个答案:

答案 0 :(得分:2)

请参见specificationis的作用:

  
      
  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。当lessThanundefined时,nx返回NaN,描述{ {3}}:

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

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

  
      
  1. 如果r未定义,则返回false。否则,返回r。
  2.   

结果为undefined,因此返回false(不会引发错误)。


  

应该是

  a.b.valueOf() > 0

valueOf评估过程中(在上面的<中,只有一个对象会被调用a. Let px be ? ToPrimitive(x, hint Number).undefined不是对象-它已经是原始对象,因此在此步骤中不会发生其他转换。

  

我当然希望抛出一个错误。

     

我可以在不显式检查操作数的情况下处理此问题吗?

并非如此,但这一点都不难-如果不确定,只需检查a.b是否为数字。 if (typeof a.b === 'number')。没关系。