【问题标题】:What is the difference between parseInt(string) and Number(string) in JavaScript? [duplicate]JavaScript 中的 parseInt(string) 和 Number(string) 有什么区别? [复制]
【发布时间】:2011-06-01 15:20:14
【问题描述】:

JavaScript 中的parseInt(string)Number(string) 有什么区别?

【问题讨论】:

标签: javascript string-conversion


【解决方案1】:

第一个有两个参数:

parseInt(string, radix)

radix参数用于指定使用哪种数字系统,例如基数为16(十六进制)表示字符串中的数字应从十六进制数解析为十进制数。

如果 radix 参数被省略,JavaScript 假设如下:

  • 如果字符串以“0x”开头,
    基数是 16(十六进制)
  • 如果字符串以“0”开头,则 基数是 8(八进制)。此功能
    已弃用
  • 如果字符串以任何其他 值,基数为 10(十进制)

你提到的另一个函数只需要一个参数:

Number(object)

Number() 函数将对象参数转换为表示对象值的数字。

如果该值不能转换为合法数字,则返回 NaN。

【讨论】:

  • 现在当radix参数省略时,JS假定radix为10。
  • @dbaq: 假定为 10 除非字符串以 0x0X 开头,在这种情况下,它被剥离并假定为 16。 (如果数字以 0 开头,则使用八进制从来不是标准的一部分,并且现在明确禁止 parseInt 从 ES2015 开始。)
【解决方案2】:
parseInt("123qwe")

返回 123

Number("123qwe")

返回NaN

换句话说,parseInt() 解析到第一个非数字并返回它解析的任何内容。 Number() 想把整个字符串转成数字,顺便说一句,也可以是浮点数。


编辑#1:Lucero 评论了可以与parseInt() 一起使用的基数。就这一点而言,请参阅下面的THE DOCTOR's answer(我不会在这里复制,文档应该有相当的名气......)。


编辑#2:关于用例:这已经有点写在字里行间了。如果您想间接检查给定字符串是否完全表示数值、浮点数或整数,请使用Number()parseInt()/parseFloat() 并不那么严格,因为它们只是在数值停止时解析并停止(基数!),这在您需要前面的数值“以防万一”时非常有用(注意 @987654330 @ 也返回 NaN)。最大的不同是使用了Number() 不知道的基数,parseInt() 可能会从给定的字符串中间接猜测(有时会导致奇怪的结果)。

【讨论】:

  • 这个答案是不完整的,因为它没有提到parseInt()执行的格式检测(十六进制/八进制/十进制),这可能会导致严重的悲痛,因为它在某些情况下的行为与常见的预期不同(前导零)。因此,基数通常应明确指定,在将其与Number() 函数进行比较时更是如此。
  • @Lucero 我同意,实际上我前段时间遇到过。这花了我一些时间来找到错误......我更新了我的答案,并引用了另一个答案。
  • @sjngm,您是否愿意就何时使用这两个函数解释您的答案?每个都有用例吗?为什么一个人在某些情况下更好?
  • 重要的是 parseInt("") 将返回 NaN,而 Number("") 将返回 0。
  • 赞成parseInt("hui") 返回NaN
【解决方案3】:

parseInt(string) 会将包含非数字字符的字符串转换为数字,只要该字符串以数字字符开头

'10px' => 10

Number(string) 如果字符串包含任何非数字字符,则返回 NaN

'10px' => NaN

【讨论】:

  • 也可以从空白处开始。
  • 也可以加减号开头。
【解决方案4】:

parseInt 函数允许您为输入字符串指定一个基数,并且仅限于整数值。

parseInt('Z', 36) === 35

作为函数调用的Number构造函数将使用语法解析字符串,并且限制为base 10和base 16。

字符串数字文字 ::: StrWhiteSpace选择 StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: 白色空间 线路终结者 StrNumericLiteral ::: StrDecimalLiteral HexIntegerLiteral StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: 无限 DecimalDigits . DecimalDigitsopt ExponentPartopt. DecimalDigits ExponentPartopt DecimalDigits ExponentPartopt 十进制数 ::: 十进制数 十进制数字 DecimalDigit ::: 其中一个 0 1 2 3 4 5 6 7 8 9 指数部分 ::: ExponentIndicator 有符号整数 ExponentIndicator ::: 其中一个 e E 有符号整数 ::: 十进制数 + 十进制数字 - 十进制数字 HexIntegerLiteral ::: 0x 十六进制数 0X 十六进制数 HexIntegerLiteral HexDigit HexDigit ::: 其中一个 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

【讨论】:

  • 您可以详细了解不同类型的半径here。但是,您可能指的是各种类型的基数/基数;见here
【解决方案5】:

@sjngm 回答的附录:

他们都忽略了空格:

var foo = "    3     ";
console.log(parseInt(foo)); // 3
console.log(Number(foo)); // 3

【讨论】:

    【解决方案6】:

    @sjngm 回答的附录:

    他们都忽略了空格:

    var foo = " 3 "; console.log(parseInt(foo)); // 3 console.log(数字(foo)); // 3

    这并不完全正确。正如 sjngm 所写,parseInt 将字符串解析为第一个数字。是真的。但问题是当你想解析用空格分隔的数字时,即。 “12345”。在这种情况下,
    parseInt("12 345") 将返回 12 而不是 12345。 因此,为避免这种情况,您必须在解析为数字之前修剪空格。 我的解决方案是:

         var number=parseInt("12 345".replace(/\s+/g, ''),10);
    

    请注意我在 parseInt() 函数中使用的另一件事。 parseInt("string",10) 会将数字设置为十进制格式。如果你要解析像 "08" 这样的字符串,你会得到 0,因为 8 不是八进制数。解释是 here

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2013-03-14
      • 2016-03-26
      相关资源
      最近更新 更多