parseInt()和Number()有什么区别?
将string转换为数字时, parseInt()
和Number()
行为有何不同?
那么,它们在语义上是不同的 , 作为函数调用的Number
构造函数执行types转换 , parseInt
执行parsing ,例如:
// parsing: parseInt("20px"); // 20 parseInt("10100", 2); // 20 parseInt("2e1"); // 2 // type conversion Number("20px"); // NaN Number("2e1"); // 20, exponential notation
请记住,如果parseInt
在string中检测到前导零,它将以八进制为基础parsing数字,这已经在标准的新版本ECMAScript 5上进行了更改,但是在浏览器实现中需要很长时间它与ECMAScript 3不兼容), parseInt
也会忽略与当前使用的base的任何数字不一致的结尾字符。
Number
构造函数不检测八进制数:
Number("010"); // 10 parseInt("010"); // 8, implicit octal parseInt("010", 10); // 10, decimal radix used
但它可以用hex符号来处理数字,就像parseInt
一样:
Number("0xF"); // 15 parseInt("0xF"); //15
此外,一个广泛使用的构造函数是一元+
运算符(第72页) ,它等效于使用Number
构造函数作为函数:
+"2e1"; // 20 +"0xF"; // 15 +"010"; // 10
typeof parseInt("123") => number typeof Number("123") => number typeof new Number("123") => object (Number primitive wrapper object)
前两个将会给你更好的性能,因为它返回一个原语而不是一个对象。
如果你正在寻找性能,那么你可能会得到最好的结果,按位右移"10">>0
。 也乘以( "10" * 1
)或不乘( ~~"10"
)。 他们都是更快的Number
和parseInt
。 他们甚至有“function”返回0为非数字参数。 这里是性能testing 。
我总是使用parseInt,但要小心强制它进入八进制模式。
我发现两个性能比较链接的几个方法之间的string
转换为int
。
parseInt(str,10) parseFloat(str) str << 0 +str str*1 str-0 Number(str)
parseInt将转换为一个整数,也就是说,它将小数点分开。 数字不会转换为整数。