Javascript a、 b<;0,当a.b===未定义时,为什么不引发错误?

Javascript a、 b<;0,当a.b===未定义时,为什么不引发错误?,javascript,node.js,comparison,throw,operands,Javascript,Node.js,Comparison,Throw,Operands,一个打字错误最终被认为是错误的 a.b > 0 带有a.b未定义。根据MDN(),比较对操作数调用.valueOf()。应该如此 a.b.valueOf() > 0 但这实际上抛出了一个似乎没有发生的错误。相反,这似乎是在评估: undefined > 0 我是不是误解了什么 在我的例子中,这导致Node.js代码中出现无声错误。我当然希望抛出一个错误 我可以在不显式检查操作数的情况下处理这个问题吗 编辑:freeCodeCamp似乎比MDN更正确地描述了这一点: 但

一个打字错误最终被认为是错误的

a.b > 0
带有
a.b
未定义。根据MDN(),比较对操作数调用
.valueOf()
。应该如此

a.b.valueOf() > 0
但这实际上抛出了一个似乎没有发生的错误。相反,这似乎是在评估:

undefined > 0
我是不是误解了什么

在我的例子中,这导致Node.js代码中出现无声错误。我当然希望抛出一个错误

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


编辑:freeCodeCamp似乎比MDN更正确地描述了这一点:

但我仍然想知道,如何最简单地处理这个问题,而不被简单的打字错误所困扰。

请参阅:它的作用:

  • 设r是执行抽象关系比较lval 它,它试图先将每一方强制为一个基元:

    a。让px去吧?TopPrimitive(x,提示编号)

    b。让我来吧?TopPrimitive(y,提示编号)

    undefined
    已经是一个原语-nothing抛出。然后,它会:

    让nx成为?扁桃体(px)

    让纽约去吧?扁桃体(py)

    undefined
    强制转换为数字也不会抛出,但会返回
    NaN

    console.log(编号(未定义))请参见:它的功能:

  • 设r是执行抽象关系比较lval 它,它试图先将每一方强制为一个基元:

    a。让px去吧?TopPrimitive(x,提示编号)

    b。让我来吧?TopPrimitive(y,提示编号)

    undefined
    已经是一个原语-nothing抛出。然后,它会:

    让nx成为?扁桃体(px)

    让纽约去吧?扁桃体(py)

    undefined
    强制转换为数字也不会抛出,但会返回
    NaN


    console.log(编号(未定义))
    如果a未定义且您尝试访问a.b,它可能会引发错误。a是否在您尝试访问a.b时定义?@AlexanderStaroselsky是,正如我所说的
    a.b
    未定义的
    (这意味着,
    a!==undefined
    @AlexanderStaroselsky Hm,我在问题中没有写清楚。感谢您指出这一点。“比较调用操作数上的
    .valueOf()
    ”-仅当操作数是对象时。它不会在基元上执行此操作values@Leo哦,哇。我现在已经修复了MDN。如果a未定义,而您正试图访问a.b,它可能会引发错误。在您试图访问a.b时,a是否已定义?@AlexanderStaroselsky是的,正如我所说的
    a.b
    未定义的
    (这意味着,
    a!==undefined
    @AlexanderStaroselsky Hm,我在问题中没有写清楚。感谢您指出这一点。“比较调用操作数上的
    .valueOf()
    ”-仅当操作数是对象时。它不会在基元上执行此操作values@Leo哦,哇。我现在已经修复了MDN。谢谢,这是一个很好的解释。这意味着MDN简化了太多(在我给出的链接中)。不过,我也在寻找一种安全的方法来处理此问题。谢谢,所以我必须显式检查操作数。谢谢,这是一个很好的解释。这意味着MDN将其简化得太多(在我给出的链接中)。不过,我也在寻找一种安全的方法来处理此问题。谢谢,所以我必须显式检查操作数。