적은 수의 줄로 작성하는 방법이 있지만 여전히 쉽게 읽을 수 있습니까?
var month = '';
switch(mm) {
case '1':
month = 'January';
break;
case '2':
month = 'February';
break;
case '3':
month = 'March';
break;
case '4':
month = 'April';
break;
case '5':
month = 'May';
break;
case '6':
month = 'June';
break;
case '7':
month = 'July';
break;
case '8':
month = 'August';
break;
case '9':
month = 'September';
break;
case '10':
month = 'October';
break;
case '11':
month = 'November';
break;
case '12':
month = 'December';
break;
}
답변
배열을 정의한 다음 인덱스로 가져옵니다.
var months = ['January', 'February', ...];
var month = months[mm - 1] || '';
답변
배열을 전혀 사용하지 않는 것은 어떻습니까? 🙂
var objDate = new Date("10/11/2009"),
locale = "en-us",
month = objDate.toLocaleString(locale, { month: "long" });
console.log(month);
// or if you want the shorter date: (also possible to use "narrow" for "O"
console.log(objDate.toLocaleString(locale, { month: "short" }));
답변
이 시도:
var months = {'1': 'January', '2': 'February'}; //etc
var month = months[mm];
참고 mm
정수 또는 문자열이 될 수 있으며, 그것은 여전히 작동합니다.
존재하지 않는 키가 빈 문자열 ''
(대신 undefined
)이되도록하려면 다음 줄을 추가합니다.
month = (month == undefined) ? '' : month;
JSFiddle .
답변
대신 배열을 만들고 월 이름을 조회 할 수 있습니다.
var months = ['January','February','March','April','May','June','July','August','September','October','November','December']
var month = months[mm-1] || '';
코드이면의 합리적인 이유는 @CupawnTae의 답변을 참조하십시오. || ''
답변
조심해!
즉시 알람 벨을 트리거해야하는 것은 첫 번째 줄입니다 var month = '';
.-이 변수가 null
또는 대신 빈 문자열로 초기화되는 이유undefined
무엇입니까? 그것은 단지 습관이거나 복사 / 붙여 넣기 된 코드 일 수 있지만, 확실히 알지 못한다면 코드를 리팩토링 할 때 무시하는 것이 안전하지 않습니다.
월 이름 배열을 사용하고 코드를 var month = months[mm-1];
변경하면 이제 범위를 벗어난 숫자 또는 숫자가 아닌 값 month
이undefined
. 이것이 괜찮다는 것을 알 수 있지만 이것이 나쁜 상황이 많이 있습니다.
예를 들어, switch
함수 monthToName(mm)
에 있고 누군가 다음과 같이 함수를 호출 한다고 가정 해 보겠습니다 .
var monthName = monthToName(mm);
if (monthName === '') {
alert("Please enter a valid month.");
} else {
submitMonth(monthName);
}
이제 배열 사용으로 변경하고을 반환 monthName[mm-1]
하면 호출 코드가 더 이상 의도 한대로 작동하지 않으며 undefined
경고를 표시해야 할 때 값 을 제출 합니다. 이것이 좋은 코드 라고 말하는 것은 아니지만 코드가 어떻게 사용되는지 정확히 알지 못하면 가정을 할 수 없습니다.
또는 줄 아래에있는 일부 코드 month
가 항상 문자열 이라고 가정하고 다음과 같은 작업을 수행 하기 때문에 원래 초기화가있을 수 있습니다.month.length
이 경우 잘못된 달 동안 예외가 발생하고 잠재적으로 호출 스크립트를 완전히 종료 할 수 있습니다.
당신이 경우 어떻게 알고 전체 컨텍스트 – 예를 들어, 그것을 모두 자신의 코드, 그리고 다른 아무도 이제까지 그것을 사용하려고하지 않습니다, 그리고 당신은 자신 당신이 미래에 변경 언젠가했다 잊지 신뢰 -이 동작을 변경하는 것이 안전 할 수있다 하지만 실제 생활에서 방어 적으로 프로그래밍하거나 동작을 철저히 문서화하는 것이 훨씬 낫다는 가정에서 많은 버그가 발생합니다.
Wasmoo의 대답 이 옳습니다 (편집 : 수락 된 답변을 포함한 다른 여러 답변도 수정되었습니다) – months[mm-1] || ''
어떤 일이 일어나고 있는지 한눈에 더 분명하게 만들고 싶다면 다음과 같이 사용할 수 있습니다.
var months = ['January', 'February', ...];
var month;
if (mm >= 1 && m <= 12) {
month = months[mm - 1];
} else {
month = ''; // empty string when not a valid month
}
답변
완전성을 위해 현재 답변을 보완하고 싶습니다. 기본적으로 break
키워드를 생략하고 적절한 값을 직접 반환 할 수 있습니다 . 이 방법은 값을 미리 계산 된 조회 테이블에 저장할 수없는 경우에 유용합니다.
function foo(mm) {
switch(mm) {
case '1': return 'January';
case '2': return 'February';
case '3': return 'March';
case '4': return 'April';
// [...]
case '12': return 'December';
}
return '';
}
다시 한 번, 조회 테이블 또는 날짜 함수를 사용하는 것이 더 간결하고 주관적으로 더 좋습니다 .
답변
배열을 사용하여 할 수 있습니다.
var months = ['January', 'February', 'March', 'April',
'May', 'June', 'July', 'August',
'September', 'October', 'November', 'December'];
var month = months[mm - 1] || '';
