問題の本質
location.hashからポンド記号
難しいケース
これは、ほとんどの開発者が見落としているように見えるものです。現代の強力にオーバースクリプトされたアプリケーションでは、 ハッシュ変数に任意のUnicode文字を含めることができます。 同じページの実際のid
素朴なアプローチ
ここに最新のものがあります-私は技術的なレビューを起草した本でそれを見つけました:
var hash = location.hash.match(/#(\w+)/)[1];
彼には一度にいくつかの問題があります。
- ハッシュに非ラテン文字または非英数字文字が含まれている場合、誤った結果が返されます。 たとえば、ハッシュ
「 #foo @ o#bar $%huh hello 」からは、単に 「foo」が取得 されます 。
- location.hash行が空の場合、 TypeErrorを スローします-.match()はnullを返すためです 。
このアプローチ
私の友人がかつて使用した別のアプローチはこれでした:
var hash = location.hash.split('#')[1];
このアプローチにも問題があります-おもしろいですが、以前のものよりも少ないですが、この方法ははるかに素朴に見えます。
- 同じテストケースでは、少なくとも
"foo@o"
が取得されます。これは、 ハッシュに記号 "#" が含まれている場合のみアプローチエラーを意味します。
- ハッシュがない場合、エラーはスローされませんが、空の文字列ではなく未定義のままになります。
正しい値を取得します。
私が通常使用する手法は、上記の2つの各手法よりもはるかに単純で、見た目が緩すぎる
var hash = location.hash.substring(1);
ただし、詳しく見てみましょう。
- キャッチーなテストハッシュから、正しい結果が得られます: "foo @ o#bar $%huh hello"
- ハッシュがない場合、空の文字列を正しく返します。
「しかし、彼は行の先頭に

追加:コメントで指摘されているように、
ただし、正規表現に夢中になっており、すべての費用をかけて彼らの助けを借りて問題を解決したい場合は、同様に防弾でほぼ同じ方法があります:
var hash = location.hash.replace(/^#/, '');
何らかの理由で( OCD ?). match()を使用して問題を解決したい場合は、これを行うことができます:
var match = location.hash.match(/^#?(.*)$/)[1];
この場合、
「単純すぎる、なぜここで時間を無駄にしているのか!」
まあ、ごめんなさい。 私は知っています:あなたの何人かにとってこれは初歩的です。 しかし、この本を書いた人は非常に知識が豊富です(そして、上に引用したコードを除いて、この本は本当に良いです)。だから、これは多くの優秀な開発者がこのタスクに適していないことを意味します。 あなたがそれらの1つではない場合、それを喜ぶ。
「ねえ、しかし、すべてがここにあるわけではありません!」
この場合、私が見逃したことを知りたいので、
