parseInt()和Number()有什么区别?


Answers:


456

嗯,它们在语义上是不同的Number称为函数构造函数执行类型转换parseInt执行解析,例如:

// parsing:
parseInt("20px");       // 20
parseInt("10100", 2);   // 20
parseInt("2e1");        // 2

// type conversion
Number("20px");       // NaN
Number("2e1");        // 20, exponential notation

请记住,如果parseInt在字符串上检测到前导零,它将以八进制为基础解析数字,这在标准的新版本ECMAScript 5中已更改,但是要花很长时间才能进入浏览器实现( (与ECMAScript 3不兼容),也parseInt将忽略与当前使用的基数的任何数字都不对应的结尾字符。

Number构造函数不检测八进制:

Number("010");         // 10
parseInt("010");       // 8, implicit octal
parseInt("010", 10);   // 10, decimal radix used

但是它可以用十六进制表示法处理数字,就像parseInt

Number("0xF");   // 15
parseInt("0xF"); //15

此外,广泛使用的构建体来执行数字类型转换,是一元+运算符(第72页),它等同于使用的Number构造为一个函数:

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10

有趣的是,parseInt是否忽略数字后面的任何字符?因为在我的情况下,转换时我希望使用NaN而不是20。
标记

是的,它确实。听起来您确实想要Number()
Gareth 2010年

好的,我想我会使用Number(),但是非常感谢您澄清了这一点以及所有这些示例!:-)
标记

1
这次真是万分感谢。这是我第一次见到NaN。对于某些人来说,知道NaN是通过isNaN(value)函数进行测试的,可能对您有所帮助。例如,仅使用“ if(value == NaN)”是行不通的。
WonderfulDay

1
Number()确实像八进制和二进制一样处理八进制:Number('0o10') == 8
Juan Mendes

22
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

前两个会返回原始值而不是对象,因此会提高性能。


20
new Number()与有所不同Number()typeof Number("123") => number
Gareth

8
new Number("1") != new Number("1")切勿使用new Number。永不永不永不。Number("1")另一方面,这是完全合理的。
Kragen Javier Sitaker '12

18
@Kragen,它一定会觉得很对社会更有益的,如果你解释了为什么你不应该使用“新号码” -而不是只输入“从来没有” 5倍...

1
@ken很老的评论,但对于未来的访问者,我想像是因为他们刚提到的原因。我解析两个数字let x = new Number("2"); let y = new Number("2");,然后无论出于何种原因都要进行相等性检查,if (x == y) { doSomething(); }从逻辑上讲doSomething应该调用它。但这不会。同样,如果您只解析一个数字,let x = new Number("2");那么x === 2它将是错误的。这是您不应该使用的明显原因new Number
汤姆ç

1
@TomC您正在查看已编辑评论的结果(这就是评论后的铅笔图标所表示的意思);以前没有零解释,只是强烈的警告。

15

如果您正在寻找性能,那么按位右移可能会获得最佳结果 "10">>0。还要乘("10" * 1)或不乘(~~"10")。所有这些都比Number和快得多parseInt。他们甚至具有“功能”,而不是数字参数返回0。这是性能测试


1
随着浏览器的修订,各种方法的速度似乎随着时间而变化。链接的测试中也发生了变化,最新的版本,因为这评论是在这里- jsperf.com/number-vs-parseint-vs-plus/39 -幸运站点包含测试的早期版本,以及
BOBO

@bobo,当然。出于好奇检查铬- Number并且parseInt仍然慢99%,比其他人。另外对我来说,它们在视觉上也不太吸引人:-)
Saulius

15
总是比“无用”的优化更喜欢代码的清晰度。对于大多数使用情况parseIntNumber更佳。如果您正在编写一个N64仿真器,每秒要进行数百万次转换,则可以考虑这些技巧。
ngryman

1
问题是关于行为的,关于性能的讨论是题外话。
气动装置

1
请注意,这不能用于大整数-特别是不适合有符号32位整数的整数-因为在JavaScript中,按位运算符会将其操作数视为32位序列,而不是十进制,十六进制或八进制数。因此(2**31).toString() >> 0将溢出到-2147483648。您可以使用>>>而不是>>让JavaScript将操作数视为无符号的 32位整数,但是任何大于的数字2**32 - 1也会溢出。
Hasc



6

摘要:

parseInt()

  • 将字符串作为第一个参数,将基数(整数作为数字系统的基数,例如十进制10或二进制2)作为第二个参数
  • 该函数返回一个整数,如果无法将第一个字符转换为数字,则将返回该整数NaN
  • 如果 parseInt()函数遇到非数值,则它将截断其余的输入字符串,仅解析该部分直到非数值。
  • 如果基数为undefined或0,则JS将假定以下内容:
    • 如果输入字符串以“ 0x”或“ 0X”开头,则基数为16(十六进制),则字符串的其余部分将解析为一个数字。
    • 如果输入值以0开头,则基数可以是8(八进制)或10(十进制)。选择哪个基数取决于JS引擎的实现。ES5指定应使用10。但是,并非所有浏览器都支持此功能,因此,如果您的数字可以以0开头,请始终指定基数。
    • 如果输入值以任何数字开头,则基数将为10

Number()

  • Number()构造可以任何参数输入转换成一个数字。如果Number()构造函数无法将输入转换为数字,NaN则将返回。
  • Number()构造还可以处理十六进制数,他们必须开始0x

例:

console.log(parseInt('0xF', 16));  // 15

// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));

// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10));  // 10

// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));


console.log('\n');


// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));

// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));

// scientific notation is allowed
console.log(Number('152e-1'));  // 15.21


5

我一直使用parseInt,但要注意会导致其进入八进制模式的前导零。


35
我认为它总是一个好主意,基数提供给parseInt(value, radix)你这样做不是偶然有这样的八进制模式转换等
awesomo

前导零在ECMAScript 3 中将其强制为八进制模式。0即使在非严格模式下,ECMAScript 5也会将其解析为。但是,这一问题已得到解决,现在忽略了前导零,因此parseInt("070")变为70
Piotrek Hryciuk '16

2
您也应该使用lint,它会警告您在中提供一个基数值parseInt()
贾斯汀

2

parseInt() ->将数字解析为指定的redix。

Number()->将指定的值转换为等效的数值或NaN(如果操作失败)。

因此,为了将一些非数字值转换为数字,我们应该始终使用Number()函数。

例如。

Number("")//0
parseInt("")//NaN

Number("123")//123
parseInt("123")//123

Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string

Number(true)//1
parseInt(true) //NaN

有各种各样的情况 parseInt()函数在进行redix转换时会遇到极端情况,因此我们应避免出于强制目的使用parseInt()函数。

现在,要检查天气提供的值是否为数字,我们应该使用本机isNaN()函数



1

除非需要十六进制或八进制,否则最好不要使用parseInt并使用Number和Math.round。两者都可以使用字符串。为什么要远离它?

parseInt(0.001, 10)
0

parseInt(-0.0000000001, 10)
-1

parseInt(0.0000000001, 10)
1

parseInt(4000000000000000000000, 10)
4

它完全屠杀了真正的大或小数字。奇怪的是,如果这些输入是字符串,它可以正常工作。

parseInt("-0.0000000001", 10)
0

parseInt("0.0000000001", 10)
0

parseInt("4000000000000000000000", 10)
4e+21

除了避免冒与此相关的错误以及发现其他错误的风险,我只避免使用parseInt,除非您需要解析除base 10以外的内容。Number,Math.round,Math.foor和.toFixed(0)可以全部做同样的事情parseInt可以用于没有这些类型的错误。

如果您确实希望或需要将parseInt用于其他一些特性,请不要使用它将浮点数转换为int。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.