哪个更好,数字(x)或parseFloat(x)?

Nam*_*oel 128 javascript optimization

哪个更好?

我问这只是为了削减几个字节,因为我可以使用+ x而不是数字(x).parsefloat做得更好吗?

Nat*_*all 270

parseFloat和Number之间的区别

parseFloat/ parseInt用于解析字符串,而Number/ +用于将值强制转换为数字.他们的行为不同.但首先让我们看看他们的行为在哪里:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000
Run Code Online (Sandbox Code Playgroud)

因此,只要您有标准数字输入,就没有区别.但是,如果您的输入以数字开头,然后包含其他字符,则parseFloat截断字符串中的数字,同时Number给出NaN(不是数字):

parseFloat('1x'); // => 1
Number('1x'); // => NaN
Run Code Online (Sandbox Code Playgroud)

另外,Number理解十六进制输入parseFloat而不:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Run Code Online (Sandbox Code Playgroud)

但是Number对于空字符串或仅包含空格的字符串,行为很奇怪:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0
Run Code Online (Sandbox Code Playgroud)

总的来说,我觉得Number更合理,所以我几乎总是Number亲自使用(你会发现很多内部JavaScript函数也都使用Number).如果某人'1x'打字我更喜欢显示错误而不是将其视为输入错误'1'.我真正做出异常的唯一一次是当我将一个样式转换为一个数字时,在这种情况下parseFloat是有用的,因为样式有一个像这样的形式'3px',在这种情况下我想放弃'px'部分然后得到它3,所以我发现parseFloat有用这里.但是你真正选择哪一个取决于你以及你想接受哪种形式的输入.

请注意,使用一元运算+符与使用Number函数完全相同:

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
Run Code Online (Sandbox Code Playgroud)

所以我通常只是简单地使用+.只要你知道它的作用,我就会发现它很容易理解.

  • 我不会认为 `Number()` 的 *whitespace=>0* 行为是“奇怪的”,我什至认为它更符合预期,空白是一个空值,但它不是空/未定义 => 0 是一个不错的结果。无论如何,对于您的展示来说,大(+):) (4认同)
  • @NathanWall:可能想提一下`Number('Infinity')=== Infinity`而``parseInt('Infinity')=== NaN` (3认同)
  • 我不会为此使用`+`(一元加),因为如果你忘记前一行的分号,可能会计算一个加法表达式. (3认同)
  • 对于它们的行为相同的情况,我发现 parseFloat 慢了 1% 到 15%,当字符串中的小数位数增加时变得更慢。在我的系统中运行 1M 时,parseFloat('1.501') 比 Number('1.501') 慢 5%,而 parseFloat('1.50137585467') 比 Number('1.50137585467') 慢 15%。所以,我选择 Number()。 (3认同)
  • @ChrisBrownie55 哇,好收获。我不知道 parseFloat 可以做到这一点。我猜无穷大不是整数! (2认同)

Jon*_*Jon 8

不同之处在于当输入不是"正确的数字"时会发生什么.Number返回NaNparseFloat"尽可能多地"解析.如果空字符串叫Number回报0,而parseFloat返回NaN.

例如:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32
Run Code Online (Sandbox Code Playgroud)

  • 注意'NaN!= NaN`虽然 (4认同)
  • 使用**isNaN()**来测试NaN值,`isNaN(NaN)`返回`true` (4认同)

mic*_*nic 7

在这些示例中,您可以看到不同之处:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;
Run Code Online (Sandbox Code Playgroud)

parseFloat 有点慢,因为它搜索字符串中数字的第一次出现,而 Number 构造器从包含带有空格的数值或包含假值的字符串创建一个新的数字实例。

PS 如果你对一些通用的类型转换解决方案感兴趣,你可以阅读我博客中关于类型转换的文章:http : //justsimplejs.blogspot.com/2012/08/data-type-conversion.html