Ситуация: нам нужно приветствовать пользователя фразой из прописных букв, если он ввёл своё имя в верхнем регистре. Например, если пользователь представился как «МИША», то система должна приветствовать его фразой: «ПРИВЕТ, МИША!». А если пользователь ввёл имя как обычно, то и приветствуем его как обычно.
Чтобы перевести строку в верхний регистр, когда все буквы становятся большими, в JavaScript используется функция toUpperCase(). Всё просто и понятно, поэтому сразу пишем такой скрипт:
// объявляем переменную
var hello = "Привет, ";
// объявляем функцию приветствия с параметром имени
function greet(name) {
// проверяем, имя написано большими буквами или нет
if (name == name.toUpperCase()) {
// если регистр верхний, приветствуем пользователя всеми прописными буквами
console.log(hello.toUpperCase() + name.toUpperCase());
// если имя написано иначе
} else {
// то приветствуем пользователя как обычно
console.log(hello + name);
}
}
// объявляем переменную со значением массива имён
var names = [];
// добавляем имя в массив, чтобы запомнить очередного пользователя
names.push(prompt('Как вас зовут?'));
// вызываем функцию приветствия
greet(names);
Но при запуске скрипта мы получаем ошибку:
❌ TypeError: toUpperCase is not a function
Что это значит: функция toUpperCase(), несмотря на то что она точно есть в JavaScript, почему-то перестала работать и делать то, что нам нужно. Теперь JavaScript считает, что такой функции нет, и выдаёт ошибку.
Когда встречается: когда мы пытаемся перевести в верхний регистр значение, которое не является строкой. В нашем случае мы пытаемся перевести в верхний регистр массив, а не строку, а с массивами toUpperCase() работать не умеет.
Что делать с ошибкой TypeError: toUpperCase is not a function
Так как функция toUpperCase() может работать только со строками, то для исправления этой ошибки нам нужно передать в функцию именно строку. В нашем примере мы передаём строки, но в массиве, а это неправильный синтаксис.
Самый очевидный способ — взять нужный элемент массива и передать его в качестве аргумента. Для этого поправим последнюю строку вызова функции greet():
// вызываем функцию приветствия и отдаём ей последний добавленный элемент
greet(names[names.length - 1]);
Теперь всё работает как нужно:
- мы запрашиваем имя пользователя;
- добавляем его в массив с зарегистрировавшимися пользователями;
- берём последний элемент массива — самое свежее имя — и отправляем его в функцию приветствия;
- внутри этой функции toUpperCase() теперь работает как нужно: переводит строку в верхний регистр.
// объявляем переменную
var hello = "Привет, ";
// объявляем функцию приветствия с параметром имени
function greet(name) {
// проверяем, имя написано большими буквами или нет
if (name == name.toUpperCase()) {
// если регистр верхний, приветствуем пользователя всеми прописными буквами
console.log(hello.toUpperCase() + name.toUpperCase());
// если имя написано иначе
} else {
// то приветствуем пользователя как обычно
console.log(hello + name);
}
}
// объявляем переменную со значением массива имён
var names = [];
// добавляем имя в массив, чтобы запомнить очередного пользователя
names.push(prompt('Как вас зовут?'));
// вызываем функцию приветствия и отдаём ей последний добавленный элемент
greet(names[names.length - 1]);