Кажется, существует огромное отвращение к созданию функции в JS. Это отвращение заставляет людей быть умными и использовать нелепые уловки, просто чтобы держать вещи в одной строке, как это было бы с вызовом функции. Конечно, имя функции в вызове также является дополнительной документацией. Мы не можем прикрепить комментарий к хитрому выражению, потому что тогда это лишит смысла делать это, поэтому мы просто называем его «js idiom», и вдруг это понятно.
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"
предполагает, что все ложные значения такие же, как и отсутствие передачи аргумента вообще.
И так далее.