此前曾有人问过parseInt(字符串)和数字(String)在JavaScript中的区别是什么?。
但答案基本上集中在radix
和parseInt
的能力上,它可以像"123htg"
这样的字符串并将其转换为123
。
我在这里要问的是,当您传递一个没有基数的Number(...)
实际数字字符串时,它和parseFloat(...)
的返回之间是否有很大的差别。
发布于 2012-08-16 13:48:06
不是的。这两者都将导致调用内部ToNumber(string)
函数。
从ES5第15.7.1节 (作为函数调用的数字构造函数):
当
Number
作为函数而不是构造函数被调用时,它执行类型转换. 返回由ToNumber(value)
计算的数字值(而不是数字对象),如果提供了值,则返回+0
。
来自ES5第15.1.2.3节 (parseFloat (string)):
..。如果
trimmedString
和trimmedString
的任何前缀都不满足StrDecimalLiteral
的语法(参见9.3.1) .
9.3.1是名为"ToNumber应用于String“的部分,这是第一个引号在表示ToNumber(value)
时所指的。
更新(见评论)
通过使用Number
操作符调用new
构造函数,您将得到Number
对象的实例,而不是数字文本。例如:
typeof new Number(10); //object
typeof Number(10); //number
这是在第15.7.2款 (数字构造函数)中定义的:
当
Number
作为new
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。
发布于 2012-08-16 13:55:09
正如@James已经回答的那样,内部的工作方式并没有那么不同。不过,这是有区别的。使用parseFloat
,以一个或多个数字字符开头的(修整)字符串和字母数字字符可以转换为数字,而Number
不会成功。如:
parseFloat('3.23abc'); //=> 3.23
Number('3.23abc'); //=> NaN
在这两个转换中,输入字符串都会被裁剪,顺便说一句:
parseFloat(' 3.23abc '); //=> 3.23
Number(' 3.23 '); //=> 3.23
发布于 2012-08-16 13:52:56
没有太大的差别,只要你确定你的字符串中只有数字。如果存在,Number
将返回NaN
。
使用Number
构造函数可能会遇到的另一个问题是,同事可能认为您忘记了new
关键字,并在稍后添加它,导致严格的比较失败new Number(123) === 123
-new Number(123) === 123
-而Number(123) === 123
->为真。
通常,我倾向于保留Number
构造函数,只需使用最短的语法将其转换为int/float:+numString
,或者使用parse*
。
https://stackoverflow.com/questions/11988547
复制相似问题