JavaScript
ECMAScript
ネタ

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);

おわりに

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

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