繁体   English   中英

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

[英]Fastest way to check if a JS variable starts with a number

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

我现在有兴趣计算此对象中为数字的键的数量,尽管很显然a for (x in obj) { if (typeof x === "number") { ... } }不会产生结果I想要,因为所有键都是字符串。

因此,我确定就我的目的而言,假设键的第一个字符是数字,那么它必须是数字就足够了,因此,我不必担心键“ 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值。 其他方法涉及解析。

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 对于任何不以数字开头的字符串,它将返回NaN

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM