Вроде в js все типы данных это объекты
вы, наверное, путаете с Python. Там, как раз, все и является объектами.
В JavaScript undefined - это примитив. Но вы можете заметить, что у примитивных значений можно вызывать методы. Например,
"javascript".length
вернет вам
10. Если у строки вызвали метод - значит, строка - это объект? Нет. В таких случаях примитивы
оборачиваются в соответствующие объекты, а затем у объекта вызывается метод. Но само значение остается примитивом, когда обертка спадает.
С другой стороны, вы можете создать строку и как объект класса String
let a = new String("javascript");
let b = "javascript";
a == b; // true
a === b; // а вот тут false
// потому что
typeof a; // "object"
typeof b; // "string"