JSで関数を作成することには大きな嫌悪感があるようです。この嫌悪感により、人々は賢くなり、関数呼び出しのように物を一行に保つためにとんでもないトリックを使用しようとします。もちろん、呼び出しの関数名は追加のドキュメントとしても機能します。トリッキーな表現にコメントを付けることはできません。コメントを付けると意味が失われ、「jsイディオム」と呼ばれ、突然理解できるようになります。
Javascriptは非常にアクセスしやすく、ほとんどの人は私たちのように朝食の仕様を食べません。そのため、彼らはイディオムの隠れた仮定とエッジケースが何であるかを決して理解しません。
x = x || 'default_value';
平均的なジョーは、これを理解していないか、デフォルト値のイディオムであると記憶しています。どちらも有害です。実際、後者はさらに有害です。彼はここで仮定とエッジケースを理解しません。彼は仕様を読み、それを理解することを気にしません。
私はそのコードを見たとき、私はそれがだ場合」を参照してください。null
またはundefined
、このデフォルト値に設定します。それはまた、暗黙的に扱いますが+0
、-0
、NaN
、false
、および""
適切な値をとしてではない。私は今から3ヶ月時にそのニーズを覚えておく必要があります変更します。おそらく忘れてしまいます。」
暗黙の仮定は将来的にバグを引き起こす可能性が非常に高く、コードベースがこのようなトリックでいっぱいになっている場合、変更がどのような影響を与えるかを考えるときはいつでもそれらをすべて頭の中に保持する可能性はありません。そして、これは「JS pro」のためです。たとえ要件が最初から偽の値を受け入れることであったとしても、平均的なジョーはバグを書いていたでしょう。
新しいスニペットには、より使い慣れた構文がありますが、上記の問題がまだあります。
あなたが行くことができます:
function f(x) {
x = valueOrDefault(x, "default_value");
}
これで、エッジケースを処理するための非常に複雑なロジックを持つことができ、クライアントコードは依然として美しく見やすくなります。
さて、関数を引数として渡すなどの高度な言語機能と、次のような巧妙なトリックをどのように区別します|| "default"
か?
巧妙なトリックは、コードが最初に作成されたときに無視できる隠された仮定の下で常に動作しています。要件が変更されたため、IIFEを別のものに変更する必要はありません。それは常に存在します。たぶん、実際のモジュールを使用できる2020年ですが、そうです。
| 0
または、~~num
フローリングに使用されるカーゴカルトバージョンは、正の32ビット符号付き整数境界を想定しています。
|| "default"
すべての偽の値が引数をまったく渡さないことと同じであると仮定します。
等々。