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

IT技术 javascript string-conversion
2021-02-10 18:01:04

JavaScript 中parseInt(string)之间有什么区别Number(string)

6个回答
parseInt("123qwe")

返回 123

Number("123qwe")

回报 NaN

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


编辑 #1:Lucero 评论了可以与parseInt(). 就这一点而言,请参阅下面的医生的回答(我不会在这里复制,该医生将享有相当的名气......)。


编辑#2:关于用例:这已经有点写在两行之间了。使用Number()的情况下,您间接要检查给定的字符串完全代表一个数值,浮点或整数。parseInt()/parseFloat()不是那么严格,因为它们只是在数值停止时继续解析并停止(基数!),这在您需要前面的数值“以防万一”时非常有用(注意parseInt("hui")也返回NaN)。最大的区别是使用了Number()不知道并且parseInt()可能从给定字符串间接猜测的基数(有时会导致奇怪的结果)。

作为parseInt("hui")回报投票NaN
2021-03-14 18:01:04
@Lucero 我同意,实际上我前段时间遇到了这个问题。这花了我一些时间来找到错误......我用另一个答案的参考更新了我的答案。
2021-03-17 18:01:04
这个答案是不完整的,因为它没有提到由 执行的格式检测(十六进制/八进制/十进制)parseInt(),这可能会导致严重的悲痛,因为它在某些情况下(前导零)的行为与常见的期望不同。因此,基数通常应明确指定,在将其与Number()函数进行比较时更是如此
2021-03-26 18:01:04
重要的是 parseInt("") 将返回 NaN,而 Number("") 将返回 0。
2021-03-27 18:01:04
@sjngm,您是否愿意就何时使用任一功能阐述您的答案?每个都有用例吗?为什么在某些情况下更好?
2021-03-31 18:01:04

第一个需要两个参数:

parseInt(string, radix)

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

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

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

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

Number(object)

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

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

现在当基数参数被省略时,JS 假定基数是 10。
2021-03-21 18:01:04
@dbaq:除非字符串以0xor开头,否则假定10 0X,在这种情况下,将删除并假定为 16。(使用八进制,如果数字开头0从来不是标准的一部分,现在parseInt在 ES2015 中被明确禁止。)
2021-03-21 18:01:04

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

'10px' => 10

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

'10px' => NaN
也可以以加号和减号开头。
2021-03-22 18:01:04
也可以从空白处开始。
2021-03-31 18:01:04

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

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

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

StringNumericLiteral :::
    StrWhiteSpace选择 
    StrWhiteSpace选择StrNumericLiteral StrWhiteSpace选择

StrWhiteSpace :::
    StrWhiteSpaceChar StrWhiteSpace选择

StrWhiteSpaceChar :::
    空白 
    行终止符

StrNumericLiteral :::
    StrDecimalLiteral 
    十六进制整数文字

StrDecimalLiteral :::
    StrUnsignedDecimalLiteral 
    + StrUnsignedDecimalLiteral 
     - StrUnsignedDecimalLiteral

StrUnsignedDecimalLiteral :::
    无穷 
    小数DecimalDigits选择ExponentPart选择 
    DecimalDigits ExponentPart选择     
    DecimalDigits ExponentPart选择

十进制数字 :::
    十进制数字 
    十进制数字十进制数字

DecimalDigit :::之一
    0 1 2 3 4 5 6 7 8 9

指数部分 :::
    指数指标有符号整数

ExponentIndicator :::之一
    ËË

有符号整数 :::
    十进制数字 
    + DecimalDigits 
     - DecimalDigits

HexIntegerLiteral :::
    0x十六进制数字 
    0X十六进制数字
    HexIntegerLiteral HexDigit

HexDigit :::之一
    0 1 2 3 4 5 6 7 8 9 ABCDEF ABCDEF
您可以在此处了解有关不同类型半径的更多信息但是,您可能指的是各种类型的基数/基数;看到这里
2021-03-28 18:01:04

@sjngm 回答的附录:

他们都忽略了空格:

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

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

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

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