Как получить все ключи объекта в JavaScript
frontend разработкаJavaScriptключиобъектыосновы языка
Что проверяют
Знаете ли вы разницу способов: что попадает в результат, а что нет. Вопрос простой, но по нему видно, насколько человек знает язык.
Как отвечать
- Object.keys(obj): собственные перечисляемые строковые ключи. Основной способ;
- Object.values и Object.entries: значения и пары,
entriesудобен для перебора и превращения вMap; - for...in: перечисляемые строковые ключи, включая унаследованные из прототипа. Поэтому его либо не используют, либо фильтруют через
Object.hasOwn(obj, key); - Object.getOwnPropertyNames(obj): все собственные строковые ключи, включая неперечисляемые;
- Object.getOwnPropertySymbols(obj): ключи-символы, которые не видит ни один из способов выше;
- Reflect.ownKeys(obj): всё собственное сразу, строки и символы.
const user = { name: "Аня", age: 30 };
Object.keys(user); // ["name", "age"]
Object.entries(user); // [["name", "Аня"], ["age", 30]]Порядок ключей определён стандартом и не случаен: сначала целочисленные по возрастанию, затем строковые в порядке добавления, затем символы. Именно поэтому объект с числовыми ключами ведёт себя неожиданно, и для словаря с произвольными ключами лучше подходит Map, где порядок вставки соблюдается всегда.
Где спотыкаются
Используют for...in и получают унаследованные свойства.
Считают, что Object.keys вернёт и символы.
Полагаются на порядок добавления, имея числовые ключи.
Не знают Object.hasOwn и пишут hasOwnProperty прямо на объекте, который может его не иметь.