読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

JavaScriptの動かないコード (初級編) if文の分岐がおかしい

javascript 動かないコード


以下のJavaScriptコードが意図した動作をしないのは,なぜですか。(制限時間1分)

<select id="my_select">
	<option value=1>有り</option>
	<option value=0>無し</option>
</select>

<input type="button" onClick="f()" value="判定">

<script language="JavaScript">
function f()
{
	// valueを取得
	var i = my_select.options[ my_select.selectedIndex ].value;

	// 1なら真
	if( i )
	{
		alert( "有りが選択されました。" );
		// 有りの場合の処理
	}
	else
	{
		alert( "無しが選択されました。" );
		// 無しの場合の処理
	}
}
</script>




答え



上のコードでは,セレクトボックスで「有り」「無し」のどちらが選択されていても,if文では「有り」の場合の分岐に入る。
つまり,i は常に true に変換される。


セレクトボックスのoptionで,

value=0

と書いている。しかし,これは実際には

value="0"

のように,文字列として解釈される。


文字列を論理型(ブール値)に変換する際,"0" はfalseにならない。数値の 0 はfalseになるが,"0"はだめである。



文字列がfalseに変換されるのは,文字列が "" (空文字列)の場合に限る。文字列が中身を持っている場合は,中身の内容にかかわらず true になる。
(NaN や undefined もfalseと解釈される。)

解決法としては、 i = parseInt( i ); として,数値に直してから評価すれば修正できる。



上記は恐らく,普段のコーディングでは間違えない初歩的な点だろう。

しかしこのミスをつい誘発しそうな状況がある。


例えば上の例のように,HTMLの属性が value=0 のように引用符なしで記述されていて,うっかり文字列であることを忘れてしまう場合。 (→ふだんから引用符を付けるべき。)


あるいは,DB中では数値として保存されている変数を,cgiなどでHTML中に表示して,その値をJavaScriptから読み込む場合。
うっかり,この変数はJavascriptでも当然数値型だという思い込みを持ってしまう可能性がある。
下記のような例。

<input type=hidden id=my_hidden value=<?php echo $number; ?> >

<script>
   // 数値をboolに変換
   alert( !! my_hidden.value );
</script>

変数を論理型に変換するためには,変数の前に !! を付ければよい。

この場合,PHP側で $number の値に 0 が入っていようが,1 が入っていようが,値がセットされていればとにかくjavascriptの出力は true である。




JavaScriptにおいてどのような型キャストが行なわれるかの一覧は,下記のサイトに詳しい。
http://www.kawa.net/works/js/learn/ba...