Javascript появился с встроенной поддержкой параметров по умолчанию с ES2015. Вопреки тому, что можно было подумать, это не просто синтаксическая замена || (логического оператора ИЛИ).

Javascript перед параметрами по умолчанию

До встроенной поддержки параметров по умолчанию можно было бы написать что-то вроде этого:

Чтобы понять приведенный выше фрагмент кода, необходимо иметь в виду следующее:

  • Правдивость / ложность. Значения в JavaScript можно разделить на правдивые и ложные. Проще говоря, Javascript пытается преобразовать переменную в логическое значение, чтобы вычислить условные выражения (например, if, for loop).
  • Оценка короткого замыкания: выражение, включающее ||, обрабатывается слева направо. При обработке слева направо компилятор достаточно умен, чтобы не обрабатывать оставшиеся элементы, если обнаруживает истинное значение. (исх .: S hort Circuiting).

Короче говоря, это всего лишь синтаксический сахар для:

Причина, по которой этот метод настолько распространен, заключается в том, что вы можете связать несколько || и позволить короткому замыканию позаботиться об этом. Представьте, что вы пишете то же самое с помощью операторов if.

Теперь, если ваша evil переменная окажется пустой строкой '' или любым ложным значением, функция выше будет считать, что это darth vader . В большинстве случаев это нормально, но может вызвать ужасные скрытые ошибки в более сложном приложении. Простой поиск с переполнением стека для решения этой проблемы приводит к ряду отличных решений, и наиболее элегантным из них является параметры по умолчанию.

Javascript после параметров по умолчанию

Давайте воспользуемся тем же примером filterEvil и посмотрим, как он будет выглядеть с параметрами по умолчанию.

На первый взгляд выглядит аккуратно и лаконично. Но не позволяйте внешнему виду обмануть вас! под капотом много чего происходит. Было бы легкомысленно предполагать, что значение по умолчанию будет действовать всякий раз, когда evil пусто.

Давайте посмотрим на некоторые важные детали,

1. D имеет значение между null и undefined.

Javascript дает два ответа на проблему не присутствует: null и undefined. (null - тема разногласий). По общему мнению, null - явное значение, указывающее на отсутствие значения. В приведенном ниже примере мы пытаемся передать null в качестве аргумента.

Функция filterEvil не заменяет evil значением по умолчанию, если передается null или любое ложное значение. .

Функция filterEvil заменит его тогда и только тогда, когда evil равно undefined. Теперь вам повезло, поскольку Javascript автоматически будет использовать undefined, если вы явно не передадите аргумент:

Об этом следует помнить при работе над проектами, которые в значительной степени зависят от null. (Хотя меня очень беспокоят разработчики, которые используют null / undefined взаимозаменяемо )

2. Оценивается слева направо

Параметры по умолчанию оцениваются слева направо. Это действительно сбивает с толку, но это очень мощная функция. Давайте посмотрим на пример.

Как видите, мы можем повторно использовать параметр слева в качестве параметра по умолчанию для чего-то справа. Обратите внимание, что respect получит параметр evil с примененной проверкой по умолчанию.

3. Вызов функции

Вы также можете вызвать функцию и использовать значение, возвращаемое в качестве параметра по умолчанию. Короче говоря, это позволяет вам вызывать обычную функцию и вычислять параметр по умолчанию на лету.

4. Оценивается во время звонка

Вот эта особенность меня больше всего смущает. Давайте посмотрим на пример.

Каждый раз, когда вы вызываете массив без аргументов, создается новый экземпляр пустого массива.

Каждый раз, когда вы вызываете filterEvil без аргумента, создается новый экземпляр пустого массива. Теперь это может стать проблемой, если вы увлекаетесь селекторами и мемоизацией. Такое поведение может легко обмануть вашу зависимую логику, думая, что что-то изменилось (я говорю с вами, React). Например, если вы используете повторный выбор в своем проекте реакции, ваш компонент может обновляться без необходимости, поскольку response будет повторно отображать с каждым новым экземпляром пустого массива.

Вот несколько интересных трюков:

  • Проверка обязательных параметров: вы можете использовать параметры по умолчанию, чтобы принудительно установить обязательный параметр. В приведенном ниже примере мы применяем зло как обязательную опору.
  • Деструктурированные параметры по умолчанию: Вы также можете использовать параметры по умолчанию в разрушенном выражении.

Надеюсь, этот пост помог вам понять параметры по умолчанию.

Если вы нашли эту статью полезной, дайте мне несколько аплодисментов 👏.

Напишите мне в Twitter @ kushan2020.