[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
徳丸浩の日記
2007年09月15日 [JavaScript]ラベルつきbreak文
_ループやswitch以外のブロックを脱出するbreak
JavaScriptでは、breakにラベルを指定できて、通常は多重ループを抜ける場合に用いられるような説明がなされていると思う。しかし、ラベル付のbreakは、ループやswitch以外の文を終わらせることもできる(Javaもそう)。
例えば以下のようなプログラム。
document.writeln("A"); L1: { document.writeln("B"); L2: { document.writeln("C"); break L1; // L1の文を終わらせるので、D、Eは実行されない document.writeln("D"); } document.writeln("E"); } document.writeln("F"); 【実行結果】 A B C F
多重ループを一気に脱出する場合は、それなりに用途を思いつくが、ただの文ブロックを抜けるとなると、限りなくgotoを使っているような感覚を覚える。文ブロック以外に、try/catch/finallyやwith文、if/elseなどでも同様である。
あえて文ブロックをbreakで抜ける用途を強引に考えてみた。ループで配列をサーチするような場合に、対象が見つかった場合と見つからなかった場合で処理を分けたい。以下のように書いてみた。
function search(a, x) { L1: { for (var i = 0; i < a.length; i++) { if (a[i] == x) { // 見つかった場合の処理 alert('見つかった:a[' + i + '] == ' + x); break L1; } } // 見つからなかった場合の処理 alert('見つからなかった:' + x); } // 共通の後始末(あれば) } search([1, 2, 5, 6, 8], 5); // 見つかる場合の呼び出し例 search([1, 2, 5, 6, 8], 7); // 見つからない場合の呼び出し例
うわっ、これは駄目だ。こんなへたくそなプログラムは人様には見せられない・・・
まぁ、こういう場合は、returnを使うんでしょうね。ただ、上記の例にはないが、「共通の後始末」が必要な場合は、ちょっとだけ上記のような書き方をする動機づけになる。try/finallyを使えばすむ話ではあるが。
追記(2007/09/16 13:20)
「へたくそな」例は僕だったらこう書くでしょうね。
function searchIndex(a, x) { for (var i = 0; i < a.length; i++) if (a[i] == x) return i; return -1; } function search(a, x) { var index = searchIndex(a, x); if (index >= 0) { // 見つかった場合の処理 alert('見つかった:a[' + index + '] == ' + x); } else { // 見つからなかった場合の処理 alert('見つからなかった:' + x); } // 共通の後始末(あれば) } search([1, 2, 5, 6, 8], 5); // 見つかる場合の呼び出し例 search([1, 2, 5, 6, 8], 7); // 見つからない場合の呼び出し例
あまり気の利いたプログラムではないと僕自身思いますが、こういう単純素朴な形なるように一生懸命考えるのが最近の好みです。そして、僕自身は多重ループからの脱出であっても、ラベルつきのbreakは使わないと思います。上記の例は、JavaScriptのトリビア的なネタということで。
自作コンパイラの部屋 > オブジェクト指向プログラム言語としてのJavaScript > ループやswitch以外のブロックを脱出するbreak
- https://www.google.co.jp/ ×1247
- http://www.tokumaru.org/JavaScript/ ×261
- http://www.tokumaru.org/ ×117
- https://www.google.com/ ×37
- http://www.tokumaru.org/JavaScript/index.htm ×23
- http://htn.to/B9DZMDD ×13
- https://www.bing.com/ ×4
- http://www.tokumaru.org/arc/list.htm ×3
- http://www.askapache.com/ ×3
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×2
- https://www.google.com.hk/ ×2
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×2
- https://www.google.at/ ×2
- http://www.tokumaru.org/d/20070915.html ×2
- http://www.tokumaru.org/books/ ×2
- http://www.so-net.ne.jp/search/web/?query=break l... ×2
- http://www.slideshare.net/ksmakoto/appcodp ×2
- http://t.co/glSkY5dDCx ×2
- http://t.co/YXdhd1RO3M ×2
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×2
- http://d.hatena.ne.jp/ockeghem/20080708 ×2
- http://search.osaifu.com/search/?w=部屋のスイッチのラベル ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- http://www.nminoru.jp/~nminoru/programming/collati... ×1
- http://sp-web.search.auone.jp/search?q=JavaScript ... ×1
- https://www.google.com.au/ ×1
- http://search.fenrir-inc.com/?q=try catch ループ 抜ける&... ×1
- http://search.fenrir-inc.com/?q=php break ループ以外で使用... ×1
- http://search.fenrir-inc.com/?q=java label 危険&hl=j... ×1
- http://search.fenrir-inc.com/?hl=ja&safe=off&chann... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=snapcr... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://search.babylon.com/?q=javascript else if 抜け... ×1
- http://search.babylon.com/?q=JAVASCRIPT IF文 抜ける&AF... ×1
- http://r.duckduckgo.com/l/?kh=-1&uddg=http://www.t... ×1
- http://nortonsafe.search.ask.com/web?q=javascript ... ×1
- http://d.hatena.ne.jp/ockeghem/20080708/p1 ×1
- http://api.twitter.com/1/statuses/show/62921751630... ×1
- http://ajalabox.blogspot.jp/2011/01/javascriptbrea... ×1
- javascript break ×12 / javascript ラベル ×8 / javascript break ラベル ×6 / java 無限ループ switch ×4 / java switch ループ ×3 / java break 呼び出し ×3 / javascript for brake ×3 / javascript 終わらせる ×2 / javascript ブロックを抜ける ×2 / java try文 終わらせる ×2 / java brake 例 ×2 / java ループ switch ×2 / javascript exit break ×2 / if ループする javascript 終わらせる ×2 / break ループ以外 ×2 / JavaScript break 文 ×2 / JavaScript break ラベル ×2 / Javascript break ×2 / JavaScript break ×2 / JavaScript ラベル ×2 / javvascript bれあk ×2 / javascript ラベル break switch ×2 / switch ループ java ×2 / javascript for 抜ける ×2 / java ループ ++以外 ×2 / Java ラベル exit loop ×1 / javascript labelとbreakの違い ×1 / javascript if break ×1 / javascript if 脱出 ×1 / javascript goto文 ×1 / javascript switch continueは使わない ×1 / javascript switch ×1 / javascript for 抜ける 階層 ×1 / javascript do loop brake ×1 / javascript switch break ×1 / javascript break 一気 ×1 / javascript FOR 途中で抜ける ×1 / javascript 後続処理をしない ×1 / javascript 配列 ラベル ×1 / javascript 多重ループ ×1 / javascript 多重ループ 脱出 ×1 / javascript 処理を終わらせる ×1 / javascript ループから脱出する ×1 / javascript ラベル 呼び出し ×1 / javascript ラベル カレンダー ×1 / msdn javascript for文 ×1 / javascript break配列 ×1 / return ラベル Java ×1 / java script ラベル ×1 / java labelを使わない ×1 / java for break ×1 / java break以外 ×1 / java 処理 終わらせる ×1 / java ブロックを抜ける ×1 / java 多重ループ 脱出 ×1 / java ループ脱出 ×1 / java アプレット 繰り返し終わらせる ×1 / java switch breakを使わない ×1 / if break javascript ×1 / if文 処理を終わらせる javascript ×1 / for文からの脱出 javascript ×1 / each ループ脱出 javascript ×1 / break label javascript 処理映らない ×1 / break javascript ×1 / break文 使わないで ×1 / break ラベル月 ×1 / Javascript ラベル function ×1 / switch java ru-pu ×1 / JavaScript 多重ループ break ×1 / JavaScript ラベル 脱出 ×1 / JavaScript ラベル : ×1 / JavaScript blerk ×1 / javascript raberu ×1 / switch 終わらせる ×1 / 多重ループ 脱出 ×1 / 呼び出しもとの for 抜ける break ×1 / ループラベルではない ×1 / ループ break 以外 ×1 / ラベルブロックをbreak ×1 / ラベル java script ×1 / プログラム とちゅうで終わらせる break以外 ×1 / ジャバスクリプト functionからの脱出 ×1 / ジャバスクリプト 多重ループ ブレイク ×1 / +javascript break ×1 / javascript if break ラベル ×1 / js if break ×1 / js ループ ラベル ×1 / javascript function break; ×1 / JavaScript 0文字 break ×1 / javascript function break ×1 / javascript brake ×1 / switch case break javascript ×1 / C言語 深い階層から抜けるには ×1 / javascript for文の脱出 ×1 / break Javascript for ラベル ×1 / switchのブロックやループから脱出します。 ×1
[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
HASHコンサルティング株式会社
最近の記事
- 2011年08月30日
- 1. RSSフィードをリダイレクトします
- 2011年07月01日
- 1.
- 2011年03月29日
- 1. PDO/MySQL(Windows版)の文字エンコーディング指定の不具合原因
- 2011年03月22日
- 1. PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり
- 2011年01月27日
- 1. CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例
- 2011年01月04日
- 1. escapeshellcmdの危険な実例
- 2011年01月01日
- 1. PHPのescapeshellcmdの危険性
- 2010年10月03日
- 1. 問題点の概要
- 2010年09月27日
- 1. 文字コードに起因する脆弱性を防ぐ「やや安全な」php.ini設定
- 2010年07月25日
- 1. ツッコミSPAM対策で、ツッコミ抜きのRSSフィードを用意しました
- 2010年07月01日
- 1. ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
- 2010年04月06日
- 1. PROXY(プロキシ)経由でのDNSリバインディングと対策
- 2010年04月05日
- 1. JavaアプレットのDNSリバインディングはJRE側で対策済みだった
- 2010年03月29日
- 1. DNSリバインディングによる無線LANパスフレーズの読み出しに成功
- 2010年03月25日
- 1. DNSリバインディングによるルータへの侵入実験
- 2010年02月22日
- 1. ケータイtwitter(twtr.jp)においてDNS Rebinding攻撃に対する脆弱性を発見・通報し、即座に修正された
- 2010年02月12日
- 1. かんたんログイン手法の脆弱性に対する責任は誰にあるのか
- 2010年01月18日
- 1. iモードブラウザ2.0のXMLHttpRequestでPOSTデータの扱いが困難になった
- 2009年10月19日
- 1. quoteメソッドの数値データ対応を検証する
- 2009年10月14日
- 1. htmlspecialchars/htmlentitiesはBMP外の文字を正しく扱えない
- 2009年10月09日
- 1. htmlspecialcharsのShift_JISチェック漏れによるXSS回避策
- 2009年09月30日
- 1. htmlspecialcharsは不正な文字エンコーディングをどこまでチェックするか
- 2009年09月24日
- 1. SQLの暗黙の型変換はワナがいっぱい
- 2009年09月18日
- 1. 文字エンコーディングバリデーションは自動化が望ましい
- 2009年09月14日
- 1. 既にあたり前になりつつある文字エンコーディングバリデーション
- 2009年08月05日
- 1. 携帯JavaScriptとXSSの組み合わせによる「かんたんログイン」なりすましの可能性
- 2009年03月28日
- 1. IPAは脆弱性の呼び方を統一して欲しい
- 2009年03月27日
- 2009年03月11日
- 1. U+00A5を用いたXSSの可能性
- 2008年12月22日
- 1. JavaとMySQLの組み合わせでUnicodeのU+00A5を用いたSQLインジェクションの可能性
「深い階層の途中まで抜ける」ってのは、たまに必要になることがあるけれど、たいていは「どこかで設計ミスしてる」ことが多い... ってのは、思考がCに毒されているからなのかね。それが「毒されてない」とするなら、
> こんなへたくそなプログラムは人様には見せられない
なんてのは、ある種必然かなと。
おごちゃん、おひさしぶり~。見ていてくれたんですね。僕も、おごちゃんのブログは見てますよ。
日経mix(懐かしい)で議論していた頃ほど、こういうところへのこだわりはなくなりましたねぇ。だんだんどうでもよくなってきました(^^; とか言いながら、「こんなの人前に出せないよ~」とか言っているやつ。
どもども^^;
最近は... つーか、MIX以後は「言語の仕様なんてどーでもいーじゃん」とか思ってプログラム書いてます。それがどれだけ建設的な議論であっても、不毛感がぬぐい去れない... ってのは、そのうち日記に書きます。
そう思いながらも、なぜかCOBOL言語委員だったりするんだよね。