2013-06-17 5 views
0

Мы используем пользовательский сборщик данных, который до сих пор должен был возвращать дату и время. Но теперь условия изменились, и иногда мне нужно вернуть только дату, поэтому я решил добавить необязательный параметр. Теперь сценарий таков:Правильное использование необязательных параметров в JavaScript

var date_format = "dd/mm/yyyy HH:MM:ss"; 

function viewCalendar(parent, destField, dateOnly) { 
    if (typeof dateOnly !== "undefined") { 
     date_format = "dd/mm/yyyy"; 
    } 
    //more code... 

Но даже несмотря на это, кажется, работает (я сделал только несколько попыток) мне не нравится это очень много, но, возможно, это потому, что я не привык к пути JavaScript , Если бы это было не из-за какой-то пример кода я бы сделать что-то вроде:

var date_format = "dd/mm/yyyy HH:MM:ss"; 
var dateOnly = true; 

function viewCalendar(parent, destField, dateOnly) { 
    if (typeof dateOnly != true) { 
     date_format = "dd/mm/yyyy"; 
    } 

Но несколько примеров, которые я видел об использовании параметров в необязательный JS я не видел, что-то вроде этого. Каков правильный способ сделать этот вид JavaScript?

ответ

1

У вас есть несколько вариантов, вы уже обнаружили typeof. Если данные не собираются быть falsy если не пропускаются, вы можете использовать logical OR||, тройную conditional operatora?b:c или if с logical NOT, чтобы проверить, чтобы установить его или нет.
У вас также есть выбор по сравнению с неопределенного или void 0, оба из которых по-прежнему будет работать, даже если параметр, как ожидается, будет falsy, за исключением прохождения неопределенных себя в качестве аргумента.

function foo(op0, op1, op2, op3, op4, op5, op6) { 
    // if with logical NOT 
    if (!op0) op0 = 'default0'; 
    // logical OR 
    op1 || (op1 = 'default1'); 
    op2 = op2 || 'default2'; 
    // ternary 
    op3 = op3 ? op3 : 'default3'; 
    // compare, below this line with falsy args too (except explicit `undefined`) 
    if (op4 === undefined) op4 = 'default4'; 
    if (op5 === void 0) op5 = 'default5'; 
    // compare combined with logical OR 
    (op6 !== undefined) || (op6 = 'default6'); 

    // log parameters to see what we have now 
    console.log(op0, op1, op2, op3, op4, op5, op6) 
} 
foo(); // default0 default1 default2 default3 default4 default5 default6 

Пожалуйста, обратите внимание, что в старых браузерах, undefined был записываемые в глобальном масштабе, и что во всех браузерах, если вы не в глобальном масштабе, undefined может быть var d или установить в качестве параметра и поэтому имеет значение, которое не является undefined.

Если вы не в порядке, выберите с помощью оператора void над неопределенным.
Если вы понимаете, что это может произойти, и вам не нужно беспокоиться о том, что кто-то затеняет undefined, не стесняйтесь использовать его.
Если вы когда-нибудь видели, что кто-то это сделал, спросите их, могут ли они varArray для вас тоже, или что-то подобное, поэтому они понимают, что они были глупыми.

+0

Я понимаю, но я больше всего сомневаюсь в том, что мне нужно определить необязательный аргумент с логическим значением или просто проверить на неопределенный. Я предпочитаю его определять, но из ответов здесь кажется, что это не нужно каким-либо образом. Правильно ли я это понимаю? – Leron

+0

_JavaScript_ не гарантирует, что все именованные параметры должны быть переданы как аргументы, но любой именованный параметр будет теневым переменным с тем же именем в родительских областях, поэтому, если они не будут переданы, это будет _undefined_, даже если они были определены в область предков. –

+0

То, что я пытаюсь сказать, находится внутри вашего второго блока кода, в 'viewCalendar', _dateOnly_ будет _undefined_, если он не был передан, хотя это' var'd выше. Это будет только «true», если «true» было передано функции _function_. –

1

я пойду с тройным оператором здесь

date_format = dateOnly ? "dd/mm/yyyy" : date_format ; 

Он будет искать truthyness в dateOnly, и либо переопределить формат или сохранит его

Также

if (typeof dateOnly != true) { 
    date_format = "dd/mm/yyyy"; 
} 

кажется неправильно, это может быть

if (dateOnly == true) { 
    date_format = "dd/mm/yyyy"; 
} 
1

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

function viewCalendar(opts) { 
    if (opts.dateOnly) { 
     date_format = "dd/mm/yyyy"; 
    } 
} 

viewCalendar({parent:foo, destField:bar, dateOnly:true}) 

Особенно полезно, когда у вас есть много дополнительных параметров.

+0

Хмм, не видели этого раньше. Спасибо за это. – Leron

+0

@Leron: это довольно распространенный факт. Jquery работает так постоянно. – georg

+0

@Leron Мне тоже нравится делать это иногда, но вам нужно помнить, что _Object_ передается _ByRef_ (в отличие от обычного поведения _ByVal_), поэтому, если вы не создаете новый _Object_ при каждом вызове, ваша функция может иметь побочные эффекты. –

Смежные вопросы