将字符串转换为数字时parseInt()
,Number()
行为如何不同?
将字符串转换为数字时parseInt()
,Number()
行为如何不同?
Answers:
嗯,它们在语义上是不同的,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
Number()
确实像八进制和二进制一样处理八进制:Number('0o10') == 8
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
前两个会返回原始值而不是对象,因此会提高性能。
new Number()
与有所不同Number()
。typeof Number("123") => number
new Number("1") != new Number("1")
。切勿使用new Number
。永不永不永不。Number("1")
另一方面,这是完全合理的。
let x = new Number("2"); let y = new Number("2");
,然后无论出于何种原因都要进行相等性检查,if (x == y) { doSomething(); }
从逻辑上讲doSomething
应该调用它。但这不会。同样,如果您只解析一个数字,let x = new Number("2");
那么x === 2
它将是错误的。这是您不应该使用的明显原因new Number
如果您正在寻找性能,那么按位右移可能会获得最佳结果 "10">>0
。还要乘("10" * 1
)或不乘(~~"10"
)。所有这些都比Number
和快得多parseInt
。他们甚至具有“功能”,而不是数字参数返回0。这是性能测试。
Number
并且parseInt
仍然慢99%,比其他人。另外对我来说,它们在视觉上也不太吸引人:-)
parseInt
或Number
更佳。如果您正在编写一个N64仿真器,每秒要进行数百万次转换,则可以考虑这些技巧。
(2**31).toString() >> 0
将溢出到-2147483648
。您可以使用>>>
而不是>>
让JavaScript将操作数视为无符号的 32位整数,但是任何大于的数字2**32 - 1
也会溢出。
我发现性能的两个链接在转换string
为的几种方法中进行了比较int
。
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
一个微小的差别是他们转换什么undefined
或者null
,
Number() Or Number(null) // returns 0
而
parseInt() Or parseInt(null) // returns NaN
parseInt()
:
NaN
。parseInt()
函数遇到非数值,则它将截断其余的输入字符串,仅解析该部分直到非数值。undefined
或0,则JS将假定以下内容:
ES5
指定应使用10。但是,并非所有浏览器都支持此功能,因此,如果您的数字可以以0开头,请始终指定基数。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
我一直使用parseInt,但要注意会导致其进入八进制模式的前导零。
parseInt(value, radix)
你这样做不是偶然有这样的八进制模式转换等
0
即使在非严格模式下,ECMAScript 5也会将其解析为。但是,这一问题已得到解决,现在忽略了前导零,因此parseInt("070")
变为70
。
parseInt()
。
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()
函数
parseInt转换为整数,即去除小数。数字不会转换为整数。
除非需要十六进制或八进制,否则最好不要使用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。