Как узнать длину (количество свойств) объекта в JavaScript?
Почему у объектов нет свойства length?
В JavaScript массивы — это особый тип объектов, оптимизированный для работы с индексированными элементами. У них есть встроенное свойство length, которое автоматически обновляется при добавлении/удалении элементов. Обычные объекты ({}) предназначены для хранения пар "ключ-значение" и не имеют такого свойства, потому что их структура не подразумевает упорядоченного числового индексирования.
Как получить количество свойств объекта?
Самый простой и современный способ — использовать статический метод Object.keys(). Он возвращает массив всех собственных перечисляемых ключей объекта. Затем вы просто берёте length этого массива.
let user = {
name: 'Иван',
age: 30,
city: 'Москва'
};
let keys = Object.keys(user);
console.log(keys); // ["name", "age", "city"]
console.log(keys.length); // 3
Этот метод работает во всех современных браузерах и среде Node.js.
Другие методы (для особых случаев)
Иногда вам могут понадобиться другие варианты:
Object.values()— возвращает массив значений свойств. Длина этого массива тоже равна количеству свойств.Object.entries()— возвращает массив пар[ключ, значение]. Длина — то же самое.Object.getOwnPropertyNames()— возвращает все собственные ключи (включая неперечисляемые, но не символы).Reflect.ownKeys()— возвращает все собственные ключи, включая символы.
Пример с учётом прототипа
Важно: Object.keys() учитывает только собственные свойства объекта, не наследованные через прототип. Это обычно то, что нужно. Если вам нужно посчитать все свойства (включая унаследованные), придётся использовать цикл for...in с проверкой hasOwnProperty():
function countAllProperties(obj) {
let count = 0;
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
count++;
}
}
return count;
}
// Или ещё короче (но только собственные):
Object.keys(obj).length;
Производительность
Метод Object.keys() работает за O(n), где n — количество свойств. Это оптимально, так как в любом случае нужно перебрать все ключи, чтобы их посчитать. Не пытайтесь изобретать велосипед с ручными циклами — встроенные методы оптимизированы движком JavaScript.
Практический совет
Если вам часто нужно получать длину объекта, можно создать небольшую вспомогательную функцию:
const objLength = obj => Object.keys(obj).length;
console.log(objLength({a: 1, b: 2, c: 3})); // 3
<<Альтернативный подход: использование Map вместо объекта
Если вы часто сталкиваетесь с необходимостью получать длину коллекции, возможно, вам стоит рассмотреть использование Map вместо обычного объекта. У Map есть встроенное свойство size, которое работает аналогично length у массивов:
let userMap = new Map([
['name', 'Иван'],
['age', 30],
['city', 'Москва']
]);
console.log(userMap.size); // 3
Map также поддерживает любые типы ключей (не только строки), сохраняет порядок вставки и имеет удобные методы set(), get(), has(), delete(). Если вам не нужны наследование и прототипы, а нужна просто коллекция данных с быстрым доступом к размеру — Map может быть лучшим выбором.
Однако если вы работаете с существующим кодом, где используются объекты, то Object.keys().length остаётся стандартным и правильным решением. Выбирайте инструмент под задачу!