Объекты: методы
Полный обзор методов Object и работы с объектами.
Object.keys, values, entries
const user = { name: 'Алиса', age: 25 };
Object.keys(user); // ['name', 'age']
Object.values(user); // ['Алиса', 25]
Object.entries(user); // [['name', 'Алиса'], ['age', 25]]
Object.fromEntries
Обратное преобразование:
Object.fromEntries([
['name', 'Алиса'],
['age', 25],
]);
// { name: 'Алиса', age: 25 }
Полезно для преобразования Map в объект:
const map = new Map([['a', 1], ['b', 2]]);
Object.fromEntries(map); // { a: 1, b: 2 }
Object.assign
Копирует свойства из источников в цель:
Object.assign({}, a, b);
Мутирует первый аргумент:
const target = {};
Object.assign(target, { a: 1 }); // target = { a: 1 }
Object.freeze / isFrozen
const obj = Object.freeze({ a: 1 });
obj.a = 2; // молча игнорируется (или ошибка в strict)
Object.isFrozen(obj); // true
Object.seal / isSealed
Запрещает добавление и удаление, разрешает изменение:
const obj = Object.seal({ a: 1 });
obj.a = 2; // ок
obj.b = 3; // не добавится
delete obj.a; // не удалится
Object.preventExtensions
Запрещает добавление новых свойств:
const obj = Object.preventExtensions({ a: 1 });
obj.b = 2; // не добавится
Object.getOwnPropertyNames
Все собственные ключи, включая неперечисляемые:
Object.getOwnPropertyNames({ a: 1 }); // ['a']
Object.getOwnPropertyNames([1, 2]); // ['0', '1', 'length']
Object.getOwnPropertyDescriptor
Информация о свойстве:
const desc = Object.getOwnPropertyDescriptor({ a: 1 }, 'a');
// { value: 1, writable: true, enumerable: true, configurable: true }
Object.defineProperty
Точное определение свойства:
const obj = {};
Object.defineProperty(obj, 'a', {
value: 1,
writable: false,
enumerable: false,
configurable: false,
});
obj.a = 2; // не сработает
Для геттеров и сеттеров:
const obj = {
_value: 0,
};
Object.defineProperty(obj, 'value', {
get() { return this._value; },
set(v) { this._value = v; },
});
Или через синтаксис:
const obj = {
_value: 0,
get value() { return this._value; },
set value(v) { this._value = v; },
};
Object.create
Создание с указанным прототипом:
const proto = { greet() { return 'привет'; } };
const obj = Object.create(proto);
obj.greet(); // 'привет'
Без прототипа:
const obj = Object.create(null);
obj.toString; // undefined
Object.is
Строгое сравнение с учётом NaN и -0:
Object.is(NaN, NaN); // true
Object.is(0, -0); // false
NaN === NaN; // false
0 === -0; // true
Object.hasOwn
ES2022, безопасная проверка:
Object.hasOwn({ a: 1 }, 'a'); // true
Object.hasOwn({ a: 1 }, 'toString'); // false
Object.groupBy
ES2024:
Object.groupBy(users, (u) => u.role);
// { admin: [...], user: [...] }
Map.groupBy
Если ключи не строки:
Map.groupBy(items, (item) => item.category);
Object.getPrototypeOf
Object.getPrototypeOf({}); // Object.prototype
Object.getPrototypeOf([]); // Array.prototype
Object.setPrototypeOf
const obj = {};
Object.setPrototypeOf(obj, { greet() {} });
Медленно. Лучше Object.create.
Итоги
keys,values,entries— обзорfromEntries— обратноassign— слияниеfreeze,seal— защитаdefineProperty— точный контрольcreate— с прототипомhasOwn— безопасная проверка