【问题标题】:parseInt alternativeparseInt 替代
【发布时间】:2010-10-10 07:49:55
【问题描述】:

首先 - 我的描述;)

我收到了来自服务器的 XmlHttpRequests JSON 响应。 MySQL驱动将所有数据输出为字符串,PHP按原样返回,所以任何整数都作为字符串返回,因此:

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

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

【问题讨论】:

  • int=string*1 怎么样?
  • 无需乘法。使用一元运算符: int = +string; (但是javascript中的每个数字仍然是一个浮点数(但我想我听说V8可能有一些优化并且实际上使用了int)
  • 我在这里创建了一个不错的小基准 :) jsperf.com/converting-string-to-int 在我测试的 Mac 上,结果似乎不是结论性的,从非常慢到超快,取决于哪个浏览器。确认!
  • ~~ 会给你一个整数; stackoverflow.com/questions/10841204/…

标签: javascript mysql ajax


【解决方案1】:

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

var int = +string;

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

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

More info.

【讨论】:

  • 在 Chrome 中,parseInt() 最快:cl.ly/image/442b10002i3T 如果考虑到需要使用 parseInt 和一元运算符检查 isNaN 的事实,双波浪号比一元运算符快,但 parseInt仍然在 Chrome 中获胜。在 IE 中,双波浪号获胜。见:jsperf.com/double-tilde-vs-parseint/6
  • 这不会解析为 int,它会解析为数字。例如+"1.5" === 1.5
  • 这个答案是旧的,不正确的,这不会转换为整数
  • parseInt 删除尾随字符,而 +string 返回 NaN。例如:'123a'
【解决方案2】:

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

foo.bar = Number(foo.bar);

这在几个方面与parseInt() 不同:

  • 前导零不会触发八进制模式
  • 浮点值也会被解析
  • 整个字符串被解析,即如果它包含额外的非数字字符,返回值将是NaN

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 不使用 parseInt 还有其他原因——比较 parseInt("07") 和 parseInt("08")
    • 那你应该使用 parseInt("07",10)
    【解决方案4】:

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

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

    顺便说一句,在使用 parseInt 时,最好始终指定第二个参数,除非您真的希望以 0 开头的字符串被解释为八进制等等:

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

    【讨论】:

      【解决方案5】:

      parseInt 的快捷方式是

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

      这是 ASM 在 js 中用来表示整数的。

      【讨论】:

      • 这很糟糕'1234567890123'|0 --> 1912276171
      • 哦,是的。让它像整数一样工作会给你整数溢出的可能性。
      【解决方案6】:

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

      同上 Daniel 所说的 - 在您对代码进行基准测试并发现它值得做之前,不要去寻找这样的微优化。

      【讨论】:

        【解决方案7】:

        Number 构造函数也存在,但在速度方面它应该与 parseInt 相同(正如已经说过的,无论如何你应该更正 PHP 部分而不是 javascript 部分):

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

        顺便说一句,如果有人感兴趣,我会好奇地搜索 parseInt 的 V8 (Google chrome) 实现,它是 here on google code

        【讨论】:

          【解决方案8】:

          如果对象较大,您可以尝试JSON,它是一种类型化格式,因此您不需要转换值。

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              投射比解析快一点,但比搜索慢。

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

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

              【讨论】:

                【解决方案11】:

                如果您解析长度为 20 或更少的十进制整数字符串,则此解决方案比 parseInt() 更快。对于某些浏览器,您可能仍然比 parseInt() 快 33 位的长度。此外,你仍然比自动施法更快。

                这是因为,浏览器的 parseInt() 确实需要一些时间来预热,所以如果你只使用一个简单的方法来解析,你会打败它一段时间,直到它赶上来。不过,不要将它用于 nodeJS。从 nodeJS 运行 parseInt() 时,启动时间比从浏览器运行时少很多。

                45 是 ASCII 中的“-”符号,43 是 ASCII 中的“+”符号。 48 是“0”。只有 48 到 57 xor 48 变成 0 - 9(按它们的顺序)。没有其他数字 xor 48 得出 0-9。

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

                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;
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-10-02
                  • 1970-01-01
                  • 2017-01-01
                  • 2022-01-05
                  • 2017-05-11
                  相关资源
                  最近更新 更多