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

IT技术 javascript performance
2021-01-28 03:15:04

如何parseInt()以及Number()将字符串转换为数字时不同的表现?

6个回答

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

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

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

parseInt将忽略后不与目前使用的碱的任何数字相对应的字符。

Number构造函数不检测隐八进制,但可以检测出明确的八进制:

Number("010");         // 10
Number("0o10")         // 8, explicit octal

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

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

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

此外,一个广泛使用的用于执行数值类型转换的构造是一元+运算符 (p. 72),它相当于将Number构造函数用作函数:

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10
parseInt("010")10在 Chrome 中返回
2021-03-12 03:15:04
Number() 确实处理八进制很像十六进制和二进制: Number('0o10') == 8
2021-03-29 03:15:04
这次真是万分感谢。这是我第一次看到 NaN。有些人知道 NaN 是用函数 isNaN ( value ) 测试的,这可能会有所帮助。例如,仅使用“if ( value == NaN )”是行不通的。
2021-04-02 03:15:04
有趣的是, parseInt 会忽略数字后面的任何字符吗?因为在我的情况下,我更喜欢在转换时获得 NaN 而不是 20。
2021-04-05 03:15:04
是的,它确实。听起来你肯定想要 Number()
2021-04-05 03:15:04
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

前两个将为您提供更好的性能,因为它返回一个原语而不是一个对象。

new Number()与 不同Number()typeof Number("123") => number
2021-03-21 03:15:04
@TomC 您看到的是编辑评论的结果(这就是评论后面的铅笔图标所表示的);以前是零解释,只是强烈的告诫。
2021-03-26 03:15:04
@Kragen,如果您解释为什么不应该使用“新号码”,而不是只输入“从不”5 次,那么对社区会更有益……
2021-04-01 03:15:04
@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
2021-04-02 03:15:04
还有new Number("1") != new Number("1")永远不要使用new Number永远永远永远永远永远。Number("1"),另一方面,是完全合理的。
2021-04-08 03:15:04

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

各种方法的速度似乎随着浏览器的修订而变化。链接的测试也已更改,此评论的最新版本在这里 - jsperf.com/number-vs-parseint-vs-plus/39 - 幸运的是该站点也包含该测试的先前版本
2021-03-20 03:15:04
请注意,这不能用于大整数 - 特别是不适合有符号 32 位整数的整数 - 因为在 JavaScript 中,按位运算符将其操作数视为 32 位序列,而不是十进制,十六进制或八进制数。因此(2**31).toString() >> 0将溢出到-2147483648. 您可以使用>>>而不是>>让 JavaScript 将操作数视为无符号32 位整数,但任何大2**32 - 1于此的数字也会溢出。
2021-03-22 03:15:04
与“无用”优化相比,始终更喜欢代码清晰。对于大多数用例parseIntNumber更可取。如果您正在编写每秒数百万次转换的 N64 模拟器,您可能会考虑这些技巧。
2021-03-23 03:15:04
问题是关于行为的,关于性能的讨论是题外话。
2021-03-25 03:15:04
@bobo,当然。出于好奇检查铬-Number并且parseInt仍然慢99%,比其他人。另外对我来说,它们在视觉上也不那么有吸引力:-)
2021-04-03 03:15:04

概括:

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

我发现在几种转换stringint.

parseInt(str,10)    
parseFloat(str)
str << 0
+str
str*1 
str-0
Number(str)

http://jsben.ch/#/zGJHM

http://phrogz.net/js/string_to_number.html