Здається, існує величезна неприязнь до створення функції в 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"
припускає, що всі хибні значення такі ж, як взагалі не передавати аргумент.
І так далі.