parseInt替代方案

时间:2009-02-27 12:51:53

标签: javascript mysql ajax

首先 - 我的描述;)

我从服务器获得了一个XmlHttpRequests JSON响应。 MySQL驱动程序以字符串形式输出所有数据,PHP按原样返回,因此任何整数都以字符串形式返回,因此:

JS中的parseInt()函数是否有任何快速替代(hack)可以解析纯数字字符串,例如:

var foo = {"bar": "123"};
...
foo.bar = parseInt(foo.bar); // (int) 123

11 个答案:

答案 0 :(得分:37)

要转换为整数,只需使用一元+运算符,它应该是最快的方式:

var int = +string;

其他类型的转换可以以类似的方式完成:

var string = otherType + "";
var bool = !!anything;

More info

答案 1 :(得分:12)

JavaScript中的类型转换是通过内置类型的构造函数完成的,没有new ,即

foo.bar = Number(foo.bar);

这与parseInt()有几点不同:

  • 前导零将不会触发八进制模式
  • 还将解析浮点值
  • 解析整个字符串,即如果它包含其他非数字字符,则返回值为NaN

答案 2 :(得分:8)

首先,您是否真的记录了它的速度慢并导致问题?否则,我不会费心寻找解决方案,因为确实没有问题。

其次,我猜想由于parseInt是一个原生的JS方法,它将以非常快的方式实现,并且可能以VM的本机语言实现(可能是C,取决于浏览器/ VM) 。我认为用纯JS制作更快的方法可能会遇到一些麻烦。 =)

当然,我不是JS大师,所以我不确定,但这是我的直觉告诉我的,并且往往是“如何为libraryFunction提供更快的替代方案”的标准答案()?”的问题。

答案 3 :(得分:6)

json_encode()之前将其转换为PHP中的int:

$foo->bar = (int)$foo->bar;
print('var foo = ' . json_encode($foo));

顺便说一下,使用parseInt时,最好总是指定第二个参数,除非你真的希望字符串从0开始被解释为八进制,依此类推:

parseInt('010', 10); // 10

答案 4 :(得分:2)

Number构造函数也存在,但它在速度方面应该与parseInt相同(如前所述,你应该更正PHP部分而不是javascript):

var i = "123";
i = new Number(i); // Number numeric wrapper
var j = "123";
j = Number(j); // Number primitive

顺便说一句,如果有人有兴趣我通过好奇心搜索了parseInt的V8(谷歌浏览器)实现,它是here on google code

答案 5 :(得分:2)

你不会比parseInt更好,但真正的错误是PHP提供的数字应该是一个字符串。

与丹尼尔所说的一致 - 在你对代码进行基准测试并发现它值得做之前,不要去寻找这样的微观优化。

答案 6 :(得分:1)

parseInt的快捷方式是

("78.5" | 0) //bitwise or forces the string to parse as int

ASM用于表示js中的整数。

答案 7 :(得分:0)

如果对象较大,您可以尝试JSON,它是一种打字格式,因此您无需转换值。

答案 8 :(得分:0)

它有多慢?这个过程每秒被调用多少次?有多少不同的数字返回值?我鞭打了一个脚本并测试了100,000个数字。从字符串中解析它们需要687毫秒。在阵列中搜索它们需要541ms。这是一个非常小的改进。我同意其他海报。你可能没有比原生的parseInt()方法更好。

答案 9 :(得分:0)

Casting比解析快一点但比搜索慢。

此外,在Firefox中,最快的方法是parseInt(),然后搜索。 Firefox的平均速度比IE快6倍。有趣。

使用一元运算符的好主意。在Firefox中,结果与parseInt()相当。在IE中,它被证明是最快的方法。

答案 10 :(得分:0)

如果您解析长度不超过20的十进制整数字符串,则此解决方案比parseInt()更快。对于某些浏览器,最大长度为33位还是比parseInt()更快。而且,您仍然比自动广播更快。

这是因为,浏览器的parseInt()确实需要花费一些时间进行预热,因此,如果仅使用一种简单的方法进行分析,则将其击败一会直到它赶上。但是不要将其用于nodeJS。从nodeJS运行parseInt()时,启动时间比从浏览器中运行时要短得多。

45是ASCII中的'-'符号,43是ASCII中的'+'符号。 48为'0'。只有48到57 xor 48变为0-9(按其顺序)。没有其他数字xor 48会产生0-9。

如果字符串不是有效的十进制整数字符串或字符串为空,则将返回undefined。如果输入的类型不是字符串,则会抛出一个值为“ Not a string”的字符串。

var toNumber = function (input) {
    if ( typeof input !== "string" ) throw "Not a string";

    var length = input.length;
    if ( length === 0 ) return;
    var c1 = input.charCodeAt(0); 

    if ( c1 === 45 || c1 === 43 ){
        if ( length === 1 ) return;
        var start = 1;
    } else {
        var start = 0;
    }

    var out = 0, c;    
    while( start < length && input.charCodeAt(start) === 48 ) start++;

    for ( ; start < length; start++){
        c = input.charCodeAt(start) ^ 48;
        if ( c > 9 ) return;
        out = (out * 10) + c;
    }

    if ( c1 === 45 ) return out * -1;
    return out;
}