2013-06-17 2 views
0

우리는 지금까지 날짜와 시간을 모두 반환해야하는 맞춤 datetime picker를 사용하고 있습니다. 하지만 이제 상황이 바뀌었고 때로는 날짜 만 반환해야하므로 선택적 매개 변수를 추가하기로 결정했습니다.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... 

그러나 심지어 (나는 단지 몇 가지 시도를했다) 내가 정말이 싫어,하지만 난 자바 스크립트의 방법에 익숙하지 않아요 때문에 어쩌면 그것의 작동하는 것 같다 생각 : 이제 스크립트는 이것이다 . 그것 때문에 내가 좋아하는 일을 할 것입니다 몇 가지 예제 코드의 아니었다면 :

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에서 optinal 매개 변수를 사용하는 방법에 대한 보았다. JavaScript의 이런 종류의 작업을 수행하는 적절한 방법은 무엇입니까?

답변

1

몇 가지 선택 사항이 있습니다. 이미 typeof을 발견했습니다. 건너 뛴 경우가 아니면 위변조이 아닌 경우 logical OR|| 세 번째 conditional operatora?b:c 또는 을 사용하여 데이터를 설정할지 여부를 확인할 수 있습니다.
는 또한 인수로 자신을 정의되지 않은 통과를 제외하고, 매개 변수가 falsy 것으로 예상되는 경우에도 여전히 작동 둘 정의되지 않은 또는 void 0,에 대한 비교를 선택할 수 있습니다. 전역 범위에하지 않으면

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는 모든 브라우저에서 그 전역에서 쓸 수 있었고, 이전 버전의 브라우저에 유의하시기 바랍니다 undefinedvar D 또는 매개 변수로 설정 될 수 및 따라서 이 아닌 값은입니다.

괜찮 으면, 정의되지 않은 것보다 void 연산자를 사용하십시오.
누군가가 그림자를 드리며 걱정할 필요가 없다는 것을 이해한다면 undefined을 자유롭게 사용하십시오.
혹시 다른 사람이 보는 것을 본 적이 있다면, var 도 물어볼 수 있습니다. 그래서 어리석은 짓을하게됩니다.

+0

나는 이해하지만 가장 의심 스럽다는 것은 선택적인 인수를 부울 값으로 정의하거나 정의되지 않은 것에 대해 확인해야한다는 것입니다. 나는 그것을 정의하는 것을 선호하지만, 여기서의 대답에서 어떤 수단으로도 필요한 것으로 보인다. 나는이 권리를 얻을 수 있습니까? – Leron

+0

_JavaScript_는 모든 명명 된 매개 변수를 인수로 전달해야한다는 것을 강요하지 않지만, 명명 된 매개 변수는 부모 범위에서 동일한 이름의 변수를 무시하므로 전달되지 않으면 _adefined_로 정의됩니다. 조상의 범위. –

+0

제가 말하고자하는 것은'viewCalendar'에서 두 번째 코드 블록 안에 있습니다. _dateOnly_는 전달되지 않았 으면 _undefined_가됩니다. 위의'var'd에도 불구하고 _dateOnly_가 전달됩니다. 'true'가 _function_에 전달 된 경우에만 'true'가됩니다. –

1

여기

date_format = dateOnly ? "dd/mm/yyyy" : date_format ; 
그것은 dateOnly의 truthyness를 찾습니다

삼항 연산자로 이동하고 하나의 형식을 무시하거나 것 또한

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_를 생성하지 않으면 함수에 부작용이있을 수있다. –