parseFloat是否会抛出错误?

6
在我正在处理的代码库中,我遇到了这样的代码:
try {
    price = parseFloat(price);
} catch (err) {
    console.log(err);
}

我知道在大多数情况下,当price无法转换为数字时,它会简单地获得NaN的值。我的问题是:是否存在会抛出错误的情况,从而需要使用try-catch结构?


1
取决于 price 是什么。尝试使用 var price = {valueOf() { throw new Error; }} - Bergi
3个回答

12

有没有情况会导致它抛出错误,需要使用try-catch结构来处理?

有。除了因为price未声明而导致的引用错误或者parseFloat被覆盖成非函数等原因外,内置的parseFloat也可能抛出异常

然而,当你传递一个字符串时,它永远不会抛出错误。只有在尝试将参数转换为字符串时失败并抛出异常时才会抛出错误。例如:

  • 传递一个符号
  • 传递一个没有[Symbol.toPrimitive].valueOf.toString方法的对象
  • 传递一个其中一个方法抛出异常的对象
  • 传递一个其中这些方法都没有返回基本类型的对象

1

如果变量不存在,它仍然可能会失败并显示错误消息。 OP明确询问在使用parseFloat()时是否有必要使用try/catch的情况。 - kb.

0

parseFloat()本身只返回数值,不会抛出错误。然而,如果上下文中未声明变量price,则会显示以下错误:

Uncaught ReferenceError: price is not defined

它解释了为什么在其周围有一个try/catch块。

所以回答你的问题:是的,有时候是必要的,如果你不能信任之前的js执行/上下文(例如由于广告拦截器或类似情况),但不是函数parseFloat()抛出错误,而是解释器。


2
那个错误与 parseFloat 没有任何关系,它是在它甚至到达 parseFloat 之前抛出的(通过尝试读取一个未声明的变量)。 - Quentin
@quentin 正确,所以我澄清了一下。但是如果你读实际问题,而不仅仅是标题,OP说我的问题是:是否有情况会抛出错误,从而需要try-catch结构? 我的答案解释了这一点,而说“不,parseFloat()不能出错”在问题的上下文中是误导性的。所以请撤回你的投票,这是OP问题的答案。 - kb.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接