首先 - 我的描述;)
我从服务器获得了一个XmlHttpRequests JSON响应。 MySQL驱动程序以字符串形式输出所有数据,PHP按原样返回,因此任何整数都以字符串形式返回,因此:
JS中的parseInt()函数是否有任何快速替代(hack)可以解析纯数字字符串,例如:
var foo = {"bar": "123"};
...
foo.bar = parseInt(foo.bar); // (int) 123
答案 0 :(得分:37)
要转换为整数,只需使用一元+运算符,它应该是最快的方式:
var int = +string;
其他类型的转换可以以类似的方式完成:
var string = otherType + "";
var bool = !!anything;
答案 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)
答案 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;
}