1

オブジェクトをハッシュ テーブルとして使用しており、通常のプロパティと整数の両方をキーとして詰め込んでいます。

私は今、このオブジェクトのキーの数を数えることに興味がありますが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ます。

これは機能しますか?charCodeAtJS 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の質問を参照してください

于 2013-01-22T21:13:15.253 に答える