我使用一个对象作为哈希表,我将常规属性和整数作为键填充。
我现在感兴趣的是计算此对象中的键数是多少,但显然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值。其他方法涉及解析。
答案 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