Заменить JavaScript параметр по умолчанию на undefined - PullRequest
37 голосов
/ 06 мая 2020

У меня есть функция с аргументом bar, у которой есть параметр по умолчанию "". Как мне заменить параметр по умолчанию bar на значение undefined?

const foo = (bar = "") => {
  console.log(bar)
}

foo(null) // null
foo(undefined) // "" <-- I want this to log `undefined`

Если это невозможно с параметрами по умолчанию, что было бы подходящим способом написать foo для достижения этого?

Ответы [ 8 ]

39 голосов
/ 06 мая 2020

что было бы подходящим способом написать foo для достижения этого?

Если вы имеете в виду значение по умолчанию только тогда, когда в вызов функции не передается параметр, тогда вам нужно для проверки длины arguments или для распространения аргументов, если вы хотите сохранить функцию стрелки.

const foo = (...args) => {
  const bar = args.length ? args[0] : "";
  console.log(bar)
}

foo(null) // null
foo(undefined) // undefined
foo(); // ""
18 голосов
/ 06 мая 2020

Нет, по задумке вы не можете.

Вы столкнулись с интересной демонстрацией "двух нулей" JavaScript, null и undefined.

null это назначенное нулевое значение

undefined это полное отсутствие какого-либо значения

Вы спросите о передаче 'value' undefined, но это предположение ошибочно. отсутствует значение undefined - undefined отсутствие значения.

Следовательно, вы не должны передавать undefined как значимое значение, которое будет интерпретироваться функцией. . Я имею в виду, вы можете, но с точки зрения JavaScript это эквивалентно передаче вообще ничего - так что вы боретесь с дизайном языка и столкнетесь с проблемами, подобными этой .

Если вы хотите передать значимое, целенаправленное нулевое значение, это то, для чего предназначен null.

12 голосов
/ 06 мая 2020

Может, потому что ты не можешь. По этой причине параметры по умолчанию предназначены для защиты от значений undefined.

Согласно документации Mozilla

Параметры функции по умолчанию позволяют инициализировать именованные параметры с помощью значения по умолчанию, если значение не указано или не передано

См. выше. Четко написано: если передано undefined, используются параметры default.

5 голосов
/ 06 мая 2020

В примере кода, который вы только что предоставили, это явно невозможно. .

Согласно официальной документации .

В JavaScript параметры функции по умолчанию не определены. Однако часто бывает полезно установить другое значение по умолчанию. Здесь могут помочь параметры по умолчанию.

3 голосов
/ 07 мая 2020

Самым определением параметров по умолчанию является отсутствие инициализации значений или undefined заданными значениями.

Итак, вы хотели бы удалить параметр по умолчанию и добавить условную проверку в свою функцию (см. Ответ Кайидо). В противном случае вы не сможете отличить foo (undefined) от foo ().

Если вы хотите, чтобы и foo (undefined), и foo () регистрировали undefined, вы можете просто удалить параметр по умолчанию

0 голосов
/ 13 мая 2020

Учитывая этот метод (машинописный текст, извините, я предполагаю, что es6 похож):

private static Foo(test: string, bar?: string): void
{
    let args = arguments && arguments.length ? arguments.length : 0;

    console.log(test, {
        bar: bar,
        type: typeof bar,
        isUndefined: bar === undefined,
        arguments: args,
        value: (bar === undefined && args == 2) ? undefined : (bar === null && args == 2) ? null : bar ? bar : ""
    });
}

Вызывается с помощью этого:

let u;
let v = undefined;

this.Foo("no parameter");
this.Foo("null", null);
this.Foo("empty", "");
this.Foo("non-empty", "non-empty");
this.Foo("undefined", undefined);
this.Foo("undefined parameter", u);
this.Foo("parameter with value of undefined", v);

Мы получаем следующие результаты:

no parameter 
{bar: undefined, type: "undefined", isUndefined: true, arguments: 1, value: ""}

null 
{bar: null, type: "object", isUndefined: false, arguments: 2, value: null}

empty 
{bar: "", type: "string", isUndefined: false, arguments: 2, value: ""}

non-empty 
{bar: "non-empty", type: "string", isUndefined: false, arguments: 2, value: "non-empty"}

undefined 
{bar: undefined, type: "undefined", isUndefined: true, arguments: 2, value: undefined}

undefined parameter 
{bar: undefined, type: "undefined", isUndefined: true, arguments: 2, value: undefined}

parameter with value of undefined 
{bar: undefined, type: "undefined", isUndefined: true, arguments: 2, value: undefined}

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

Посмотрев на количество аргументов, мы можем определить, отсутствует ли аргумент, а затем, если он точно (===) undefined или null.

0 голосов
/ 06 мая 2020

const foo = bar => {
  console.log(bar)
}

foo(null) // null
foo(undefined) // "" <-- i want this to log`undefined`

Следует удалить параметр по умолчанию, чтобы получить значение undefined.

0 голосов
/ 06 мая 2020

const foo = (bar) => {
  console.log(bar)
}

foo(null) // null
foo(undefined) // "" <-- i want this to log`undefined`

Назначьте undefined вместо пустой строки, и вы получите ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...