if (new Boolean(false) && "false") {
	alert("Oops!");
}

変数や関数の引数に型を制限できる、型に厳密なプログラミング言語では、
ソースコードを解析した時点で、互換性がない型の値を検出できる。

しかし、JavaScript の値の型は常に実行時に決まる。
なので、原則として、その文を実行するまで、
どのような型が渡されるかは検出できない。

これが何を意味するかというと、関数の引数等、外部から受け取る値については、
設計者が想定している型である保障がないため、
値を使う前に、型を確認する必要があるということだ。

だが、常に型を確認するということは、コーディングの苦痛以外の何者でもないため、
JavaScript は型を制限できない代わりに、自動的・暗黙の型変換を行う仕組みを持っている。

例えば、if ステートメントは、条件式として、Boolean プリミティブ値を要求し、
* 演算子の両辺は、Number プリミティブ値を要求する。

こういった、特定の型を要求する文脈においては、
渡された値の型が正しいかを確認するのではなく、必要な型への値の変換が試されるのである。

if の場合は、Boolean プリミティブ値を要求するが、
UndefinedNull 型の値は falseNumber プリミティブ値は、0 や NaN のみ false
String プリミティブ値は、空文字列のみ false と評価され、
それ以外の値やあらゆるオブジェクトは true と評価される。

この暗黙の型変換は、JavaScript の便利な機能だが、
その変換に関するルールを把握しておかないと、
反対にバグを生むことになるので注意が必要だ。

冒頭の例では、alert は実行される。
"false" という文字列は、false とは無関係であり、
Java のように、Boolean がボックス化解除され、
boolean プリミティブとして評価されることもないのだ。