Объяснение неожиданного результата
Причина, по которой этот код возвращает undefined
, заключается в том, что у вас есть необработанный регистр, который не имеет никакого возвращаемого значения. Каждый оператор if имеет свой собственный оператор else return false
. Так что проблем там нет. Однако оператор switch не обрабатывает случай default
. Это единственное место, которое не имеет возвращаемого значения, поэтому это должно быть проблемой.
Проблема возникает со строковым вводом для первого числа, поскольку он передает операторы , если , но не соответствует ни одному switch case.
console.log("'3' <= 12 //=>", '3' <= 12);
console.log("'3' >= 1 //=>", '3' >= 1);
console.log("'3' == 3 //=>", '3' == 3);
console.log("'3' === 3 //=>", '3' === 3);
// ^ used for switch comparison
Это означает, что если вы запускаете свою функцию с такими входами, как months(3, 1) //=> "March"
, тогда как months('3', 1) //=> undefined
. Сначала преобразуйте строку в целое число , чтобы правильно соответствовать одному из случаев. Это связано с тем, что в корпусах коммутаторов используется строгое сравнение .
После вашего редактирования это становится еще более понятным, поскольку мы можем видеть, откуда поступают данные.
var month = prompt("Enter an integer from 1 to 12 inclusive, representing a month of the year");
console.log(month, typeof(month));
Альтернативное решение
С объяснением неожиданного результата с дороги. Давайте посмотрим на некоторый код, который дает похожие результаты.
var monthsByNumber = {
1: { 1: "January", 2: "31" },
2: { 1: "February", 2: "28" },
3: { 1: "March", 2: "31" },
4: { 1: "April", 2: "30" },
5: { 1: "May", 2: "31" },
6: { 1: "June", 2: "30" },
7: { 1: "July", 2: "31" },
8: { 1: "August", 2: "31" },
9: { 1: "September", 2: "30" },
10: { 1: "October", 2: "31" },
11: { 1: "November", 2: "30" },
12: { 1: "December", 2: "31" }
};
// This allows you to access the object attributes with either
// a string or a number.
console.log("monthsByNumber[1] //=>", monthsByNumber[1]);
console.log("monthsByNumber['1'] //=>", monthsByNumber['1']);
// Introducing this into the function would look something
// like this.
function months(month, request) {
// Normally you would define monthsByNumber here, but
// in this case I needed it in my demonstration
// above.
// Use an empty object if it can't find the month.
month = monthsByNumber[month] || {};
return month[request];
}
// As you can see below this works with both numbers as well
// as strings.
console.log("months(1, 1) //=>", months(1, 1));
console.log("months('1', '2') //=>", months('1', '2'));
console.log("months(32, 1) //=>", months(32, 1));
Приведенный выше код работает так же, как и следовало ожидать в текущей функции месяцев . Единственное изменение состоит в том, что undefined
возвращается в случае неверного ввода. Что для меня имеет больше смысла, чем возвращение false
. Если бы я попросил вас дать мне имя 14-го месяца, ответ «Я не знаю» лучше подходит, чем «Я не могу» . Вот где это примерно переводится.
Однако я бы предложил изменить наименование, поскольку ключи 1
и 2
для названия месяца и дней соответственно не очень очевидны. Я бы выбрал что-то вроде { name: 'January', days: '31' }
, но для этого нужно изменить одну из двух вещей. Либо вход request
также должен быть "name"
или "days"
, другой вариант - преобразование ввода request
в правильный формат. request = request == 1 ? "name" : "days"
. Кроме того, вы также можете рассмотреть возможность возврата нормального числа для дней вместо строки.
В JavaScript также есть Date встроенная функция, которую вы, возможно, захотите использовать для учета високосных лет и других вещей, но я не буду вдаваться в подробности об этом здесь .