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

时间:2013-01-22 21:09:13

标签: javascript

我使用一个对象作为哈希表,我将常规属性和整数作为键填充。

我现在感兴趣的是计算此对象中的键数是多少,但显然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
     ...
  }
}

从而避免使用正则表达式和parseInt等。

这会有用吗? charCodeAt是JS 1.2所以这应该是防弹的,是吗?

提示:我很乐意看到一个jsperf将我的功能与每个人的想法进行比较。 :)我自己做,但jsperf困惑我

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

为什么要推测you can measure。在Chrome上,您的方法似乎是最快的。在我的测试运行中,所提出的替代方案都落后了大约60%。

答案 3 :(得分:0)

您也可以使用isNaN(x)isFinite(x) - 请参阅this SO question