拼写错误最终为
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 :
- Let r be the result of performing Abstract Relational Comparison lval < rval.
其中does ,它首先尝试将每一方强制为原始:
a. Let px be ? ToPrimitive(x, hint Number).
b. Let py be ? ToPrimitive(y, hint Number).
undefined
已经是一个原始的 - 没有抛出任何异常。然后,它会:
Let nx be ? ToNumeric(px).
Let ny be ? ToNumeric(py).
选 Angular undefined
to a Number 也不会抛出异常,但会返回 NaN
:
console.log(Number(undefined));
那么我们就开始
If Type(nx) is the same as Type(ny), return Type(nx)::lessThan(nx, ny).
哪里nx
是 NaN
和ny
是 0。lessThan
返回undefined
当nx
是 NaN
,描述here :
- If x is NaN, return undefined.
然后,回到 5.
之后的步骤在答案的开头:
- If r is undefined, return false. Otherwise, return r.
结果是undefined
,所以false
返回(没有抛出错误)。
So it should be
a.b.valueOf() > 0
只有对象才会有valueOf
过程中调用了它<
评估(在上面的 a. Let px be ? ToPrimitive(x, hint Number).
中)。 undefined
不是一个对象 - 它已经是一个基元,因此该步骤不会发生额外的转换。
I certainly wanted that an error was thrown instead.
Can I handle this without explicitly checking the operands?
不是真的,但这应该不难做到 - 只需检查 a.b
如果您不确定的话,首先是一个数字。 if (typeof a.b === 'number')
。这没有什么问题。
关于javascript - a.b < 0,为什么当 a.b === undefined 时不会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58617590/