Posted at

JavaScript if (a = false) の中身を実行させる

JavaScriptでは、代入は文ではなく式なので、値を返します。

if (a = 1) { /* 常に実行される */ }

if (a == 1) { /* aを1に変換できるときに実行される */ }
if (a === 1) { /* a が1のときに実行される */ }

そのため、

if (a = false) {

console.log('This sould not be executed!');
}

の中身は絶対に実行されません。

これを実行されるようにするというのが、今回のお題です。

一昔前にa == 1 && a == 2 && a == 3を成り立たせる、というのが流行りましたが、それと似たようなものです。


解答例

const foo = (a) => !{

if (a = false) {
console.log('This should not be executed!');
}
}.

if (true)
foo(true);

実行結果

This should not be executed!


解説

// 関数 foo の定義

const foo = (a) => !{
// ^
// 単項演算子 ! があるため、 {} はブロックではなくオブジェクトリテラルとみなされる

// メソッド if の定義
if (a = false) {
// ^^^^^^^^^
// 引数 a とそのデフォルト値 false を指定

// if メソッド呼び出し時に必ず実行される
console.log('This should not be executed!');
}
} .
// ^
// プロパティアクセスのための .

if (true)
// ^^^^^^^^^
// if メソッド呼び出し

// ASI(自動セミコロン挿入)によってこの改行部分にセミコロンが挿入される
// foo の定義ここまで

// 関数 foo の呼び出し
foo(true);


おわりに

これも、頭の体操としては面白いのではないでしょうか。

皆さんもぜひやってみてください。他の言語(代入が文の言語では無理ですが)で試しても面白いと思います。