Почему ошибка is not a function в JavaScript и как её исправить?
Вызываю метод, а консоль пишет TypeError: x.map is not a function или someFunc is not a function. Хотя функция вроде есть. Из-за чего возникает is not a function и как понять, в чём дело?
2 ответа
Эта ошибка значит: ты вызываешь как функцию () что-то, что функцией не является — либо метода нет у этого типа, либо переменная содержит не то.
Причина 1 — метод не подходит типу. Самое частое — .map/.filter на том, что не массив:
const data = { items: [1, 2, 3] };
data.map(x => x); // TypeError: data.map is not a function (data — объект!)
data.items.map(x => x); // верно — массив внутри
Или ответ сервера оказался строкой/объектом, а ты ждал массив. Проверь Array.isArray(data).
Причина 2 — опечатка в имени метода:
'abc'.toUpercase(); // is not a function — правильно toUpperCase (с большой C)
'abc'.toUpperCase(); // верно
Причина 3 — переменная не функция:
const handler = 5;
handler(); // is not a function — это число
Причина 4 — метод вызван не на том объекте или поле undefined:
const obj = {};
obj.doSomething(); // is not a function — у obj нет такого метода
Как искать: прочитай, что слева от точки в сообщении (x.map → смотри на x) и залогируй его:
console.log(typeof x, Array.isArray(x), x);
Увидишь, что x не то, чем ты его считал. Дальше — либо исправь опечатку метода, либо добейся, чтобы переменная содержала нужный тип (массив/функцию).
Отдельная коварная разновидность — когда метода ещё нет, потому что объект собирается асинхронно или библиотека не загрузилась.
Например, обратился к arr.map, а arr пришёл как null/undefined из незавершённого запроса. Подстрахуйся дефолтом:
const list = data.items ?? [];
list.map(x => x * 2); // на пустом массиве не упадёт
И проверь регистр букв в имени метода — JS чувствителен к регистру, getElementByID вместо getElementById тоже даст «is not a function».