[英]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.