1

我正在使用一个对象作为哈希表,并且我已经将常规属性和整数作为键填充到其中。

我现在有兴趣计算此对象中的键数,这些键是数字,但显然 afor (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

4 回答 4

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
于 2013-01-22T21:22:12.207 回答
2

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

于 2013-01-22T21:18:04.560 回答
2

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

于 2013-01-22T21:25:58.650 回答
0

您也可以使用isNaN(x)isFinite(x)- 看到这个 SO question

于 2013-01-22T21:13:15.253 回答