最近の記事
- 4/24 - 優先順位
- 3/17 - vbNullString と 空文字列 ""
- 3/15 - InputBox 関数の戻り値
- 3/13 - 紙と Excel と VBA
- 3/9 - 未だに Visual Basic 6
- 11/14 - ぼて閉鎖
- 11/9 - 関数オブジェクトの呼び出し
- 9/7 - メソッドとしての関数オブジェクト
- 8/18 - コンストラクタとしての関数オブジェクト
- 8/4 - オブジェクトの生成
Entering Passive Mode
if (new Boolean(false) && "false") {
alert("Oops!");
}
変数や関数の引数に型を制限できる、型に厳密なプログラミング言語では、
ソースコードを解析した時点で、互換性がない型の値を検出できる。
しかし、JavaScript の値の型は常に実行時に決まる。
なので、原則として、その文を実行するまで、
どのような型が渡されるかは検出できない。
これが何を意味するかというと、関数の引数等、外部から受け取る値については、
設計者が想定している型である保障がないため、
値を使う前に、型を確認する必要があるということだ。
だが、常に型を確認するということは、コーディングの苦痛以外の何者でもないため、
JavaScript は型を制限できない代わりに、自動的・暗黙の型変換を行う仕組みを持っている。
例えば、if ステートメントは、条件式として、Boolean プリミティブ値を要求し、
* 演算子の両辺は、Number プリミティブ値を要求する。
こういった、特定の型を要求する文脈においては、
渡された値の型が正しいかを確認するのではなく、必要な型への値の変換が試されるのである。
if の場合は、Boolean プリミティブ値を要求するが、
Undefined や Null 型の値は false、Number プリミティブ値は、0 や NaN のみ false、
String プリミティブ値は、空文字列のみ false と評価され、
それ以外の値やあらゆるオブジェクトは true と評価される。
この暗黙の型変換は、JavaScript の便利な機能だが、
その変換に関するルールを把握しておかないと、
反対にバグを生むことになるので注意が必要だ。
冒頭の例では、alert は実行される。
"false" という文字列は、false とは無関係であり、
Java のように、Boolean がボックス化解除され、
boolean プリミティブとして評価されることもないのだ。
コメント (0 件)