Javascript 检查JS变量是否以数字开头的最快方法

Javascript 检查JS变量是否以数字开头的最快方法,javascript,Javascript,我将对象用作哈希表,并将正则属性和整数作为键填充到其中 我现在感兴趣的是计算这个对象中的数字键的数量,虽然显然afor(x in obj){if(typeof x==“number”){…}不会产生我想要的结果,因为所有键都是字符串 因此,我确定,就我的目的而言,假设一个键的第一个字符是一个数字,那么它必须是一个数字就足够了,因此我不担心键“3a”是否被“错误地”确定为一个数字 考虑到这种放松,我想我可以这样检查一下 for (x in obj) { var charCode = x.cha

我将对象用作哈希表,并将正则属性和整数作为键填充到其中

我现在感兴趣的是计算这个对象中的数字键的数量,虽然显然a
for(x in obj){if(typeof x==“number”){…}
不会产生我想要的结果,因为所有键都是字符串

因此,我确定,就我的目的而言,假设一个键的第一个字符是一个数字,那么它必须是一个数字就足够了,因此我不担心键“3a”是否被“错误地”确定为一个数字

考虑到这种放松,我想我可以这样检查一下

for (x in obj) {
  var charCode = x.charCodeAt(0);
  if (charCode < 58 && charCode > 47) { // ascii digits check
     ...
  }
}
用于(obj中的x){
var charCode=x.charCodeAt(0);
如果(charCode<58&&charCode>47){//ascii数字检查
...
}
}
从而避免使用正则表达式和
parseInt

这样行吗
charCodeAt
是JS1.2,所以应该是防弹的,是吗

提示:我希望看到一个jsperf将我的函数与大家提出的函数进行比较。:)我想自己做,但jsperf让我困惑


更新:感谢启动JSPerf,它证实了我的希望,
charCodeAt
函数将执行一段非常快速的代码,读取字符的int值。其他方法涉及解析

您也可以使用
isNaN(x)
isFinite(x)
-请参见您也可以使用
isNaN(x)
isFinite(x)
-请参见这个问题具有误导性,因为很难说出变量的名称,但在示例中,您处理的是对象属性(当然是一些变量…)。在这种情况下,如果您只需要知道它是否以数字开头,那么最好的选择可能是
parseInt
。对于任何不以数字开头的字符串,它都将返回
NaN

这个问题是误导性的,因为很难说出变量的名称,但在本例中,您处理的是对象属性(当然是一些变量…)。在这种情况下,如果您只需要知道它是否以数字开头,那么最好的选择可能是
parseInt
。对于任何不以数字开头的字符串,它将返回
NaN

parseInt(x,10)
将正确解析字符串中的前导正数或负数,请尝试以下操作:

function startsWithNumber(x) {
    return !isNaN(parseInt(x, 10));
}

startsWithNumber('123abc'); // true
startsWithNumber('-123abc'); // true
startsWithNumber('123'); // true
startsWithNumber('-123'); // true
startsWithNumber(123); // true
startsWithNumber(-123); // true
startsWithNumber('abc'); // false
startsWithNumber('-abc'); // false
startsWithNumber('abc123'); // false
startsWithNumber('-abc123'); // false
parseInt(x,10)
将正确解析字符串中的前导正数或负数,请尝试以下操作:

function startsWithNumber(x) {
    return !isNaN(parseInt(x, 10));
}

startsWithNumber('123abc'); // true
startsWithNumber('-123abc'); // true
startsWithNumber('123'); // true
startsWithNumber('-123'); // true
startsWithNumber(123); // true
startsWithNumber(-123); // true
startsWithNumber('abc'); // false
startsWithNumber('-abc'); // false
startsWithNumber('abc123'); // false
startsWithNumber('-abc123'); // false


为什么要推测何时。在Chrome上,您的方法似乎是最快的。在我的测试运行中,建议的替代方法都落后了大约60%。

为什么要推测何时。在Chrome上,您的方法似乎是最快的。建议的替代方法在我的测试运行中都落后了大约60%。

看起来不错。1.2在1997年发布,所以除非你的目标是Internet Explorer 3.0,否则你是安全的。看这里:@似乎你试图给出不正确的建议。请仔细阅读我的第二段。你是否也需要考虑负整数?如果是,你还有一个符号可以允许…@ScottSauyet,我做了一个:-随意分叉和编辑。我觉得很好。1.2是r追溯到1997年,所以除非你的目标是Internet Explorer 3.0,否则你是安全的。看这里:@尽管看起来你试图给出错误的建议。请阅读我的第二段。你是否也需要考虑负整数?如果是,你还有一个符号可以允许…@ScottSauyet,我做了一个:-随意分叉和编辑。所以问题是,那些更好的/快于(<58和& 47)的CKCKI会认为它更好,因为它不会中断,如果稍后添加密钥“123FO”,那么这个答案与原来的解决方案有不同的答案,尽管也许是更好的答案。<代码> ISNAN(‘3A’)==false < /代码>,而<代码>原始解(‘3A’)问题是,那些更好的/快于(<58和& 47)的CKCKI会认为它更好,因为它不会中断,如果稍后添加密钥“123FO”,它会有不同于原来的解决方案的答案,尽管也许是更好的答案。<代码> ISNAN(‘3A’)==false < /代码>,而<代码>原始解决方案。('3a')===true。实际上,
parseInt
也是一个可靠的选择,在性能上可能类似于
isNaN
,尽管很明显只需要检查第一个字符。实际上,
parseInt
也将是一个可靠的选择,在性能上可能类似于
isNaN
,尽管很明显,只有第一个字符需要检查字符需要检查。谢谢!在JSPerfWow上你不经常看到60M操作/秒!看看Firefox 18的那个栏!!有些东西告诉我JIT正在优化某些东西。@StevenLu,是的,我也不得不自己测试,得到了一个非常类似的结果。我会看看是否可以更改测试用例,以便JIT不会像redun一样删除代码路径dant,我想这就是正在发生的事情。@StevenLu在回答这个问题之后,我们用6500万次的时间获得了Chrome的代码,用4500万次的时间获得了Firefox的代码。@StevenLu要么我不知道如何欺骗Firefox js编译器,要么Firefox在
charCodeAt
上真的那么快:谢谢!在JSPerfWo上不经常看到6000万次的操作/秒w!看看Firefox 18的那个条!!有些东西告诉我JIT正在优化某些东西。@StevenLu,是的,我也不得不自己测试,得到了一个非常相似的结果。我会看看我是否可以更改测试用例,这样JIT就不会删除冗余的代码路径,我想这就是正在发生的事情。@StevenLu一旦我们在6500万次中获得了我们的代码对于Chrome和Firefox来说,在回答这个问题之后,有4.5亿次:。@StevenLu要么我不知道如何欺骗Firefox js编译器,要么Firefox在
charCodeAt
上真的那么快: