Javascript Object Methods Cheatsheet
Comprehensive reference for JavaScript Object static methods and instance methods including Object.create, Object.assign, Object.keys, Object.entries, Object.freeze, and modern ES6+ methods
Table of Contents
- Prerequisites
- Object Creation Methods
- Property Access Methods
- Property Descriptor Methods
- Iteration Methods
- Transformation Methods
- Comparison Methods
- Prototype Methods
- Modern Methods (ES6+)
- Best Practices
Prerequisites
JavaScript Version: This cheatsheet targets ES2023+. Some methods require specific versions (noted inline).
// Check JavaScript version supportconsole.log(Object.keys({ a: 1 })); // ES5+console.log(Object.assign({}, { a: 1 })); // ES6+console.log(Object.entries({ a: 1 })); // ES2017+console.log(Object.hasOwn({ a: 1 }, "a")); // ES2022+Browser Support: Most methods work in modern browsers. Check MDN compatibility for specific versions.
Object Creation Methods
Object.create() ποΈ
Creates a new object with specified prototype and properties.
// Basic usage - create object with prototypeconst proto = { greet: () => "Hello" };const obj = Object.create(proto);obj.name = "John";console.log(obj.greet()); // β 'Hello'console.log(obj.name); // β 'John'
// Create with null prototype (no inherited properties)const cleanObj = Object.create(null);cleanObj.prop = "value";console.log(cleanObj.toString); // β undefined (no Object.prototype)
// Create with property descriptorsconst objWithDesc = Object.create( {}, { name: { value: "Alice", writable: false, enumerable: true, configurable: false, }, age: { value: 30, writable: true, enumerable: true, }, },);console.log(objWithDesc.name); // β 'Alice'objWithDesc.name = "Bob"; // β Silent failure (writable: false)
// Create empty object (equivalent to {})const empty = Object.create(Object.prototype);Object.assign() π
Copies enumerable own properties from source objects to target object.
// Basic usage - shallow copyconst target = { a: 1 };const source = { b: 2, c: 3 };Object.assign(target, source);console.log(target); // β { a: 1, b: 2, c: 3 }
// Multiple sources (later sources override earlier)const obj = {};Object.assign(obj, { a: 1 }, { b: 2 }, { a: 3 });console.log(obj); // β { a: 3, b: 2 }
// Clone object (shallow copy)const original = { a: 1, b: { c: 2 } };const clone = Object.assign({}, original);clone.b.c = 99;console.log(original.b.c); // β 99 (shallow copy!)
// Merge with defaultsfunction createUser(options) { const defaults = { name: "Anonymous", age: 0, active: true }; return Object.assign({}, defaults, options);}const user = createUser({ name: "John", age: 30 });console.log(user); // β { name: 'John', age: 30, active: true }
// β Don't use for deep cloningconst nested = { a: { b: { c: 1 } } };const shallow = Object.assign({}, nested);shallow.a.b.c = 2;console.log(nested.a.b.c); // β 2 (mutated original!)Object.fromEntries() π
Creates object from array of key-value pairs (inverse of Object.entries).
// Convert array of pairs to objectconst entries = [ ["name", "John"], ["age", 30],];const obj = Object.fromEntries(entries);console.log(obj); // β { name: 'John', age: 30 }
// Convert Map to objectconst map = new Map([ ["a", 1], ["b", 2],]);const objFromMap = Object.fromEntries(map);console.log(objFromMap); // β { a: 1, b: 2 }
// Transform object propertiesconst original = { name: "John", age: 30 };const transformed = Object.fromEntries( Object.entries(original).map(([key, value]) => [ key.toUpperCase(), typeof value === "number" ? value * 2 : value, ]),);console.log(transformed); // β { NAME: 'John', AGE: 60 }
// Convert URLSearchParams to objectconst params = new URLSearchParams("name=John&age=30");const paramsObj = Object.fromEntries(params);console.log(paramsObj); // β { name: 'John', age: 30 }Property Access Methods
Object.keys() π
Returns array of objectβs own enumerable property names.
// Basic usageconst obj = { a: 1, b: 2, c: 3 };console.log(Object.keys(obj)); // β ['a', 'b', 'c']
// Iterate over keysconst user = { name: "John", age: 30, city: "NYC" };Object.keys(user).forEach((key) => { console.log(`${key}: ${user[key]}`);});// β name: John// β age: 30// β city: NYC
// Check if object has propertiesconst isEmpty = (obj) => Object.keys(obj).length === 0;console.log(isEmpty({})); // β trueconsole.log(isEmpty({ a: 1 })); // β false
// Get keys in specific order (ES2022+)const ordered = { 1: "a", 2: "b", 10: "c" };console.log(Object.keys(ordered)); // β ['1', '2', '10'] (string keys)
// β Doesn't include non-enumerable propertiesconst objWithHidden = {};Object.defineProperty(objWithHidden, "hidden", { value: "secret", enumerable: false,});console.log(Object.keys(objWithHidden)); // β [] (hidden not included)Object.values() π
Returns array of objectβs own enumerable property values.
// Basic usageconst obj = { a: 1, b: 2, c: 3 };console.log(Object.values(obj)); // β [1, 2, 3]
// Sum all valuesconst prices = { apple: 1.5, banana: 0.8, orange: 2.0 };const total = Object.values(prices).reduce((sum, price) => sum + price, 0);console.log(total); // β 4.3
// Filter valuesconst scores = { alice: 95, bob: 87, charlie: 92 };const highScores = Object.values(scores).filter((score) => score >= 90);console.log(highScores); // β [95, 92]
// Get unique valuesconst data = { a: "x", b: "y", c: "x" };const unique = [...new Set(Object.values(data))];console.log(unique); // β ['x', 'y']Object.entries() π
Returns array of objectβs own enumerable [key, value] pairs.
// Basic usageconst obj = { a: 1, b: 2, c: 3 };console.log(Object.entries(obj)); // β [['a', 1], ['b', 2], ['c', 3]]
// Iterate over entriesconst user = { name: "John", age: 30 };for (const [key, value] of Object.entries(user)) { console.log(`${key}: ${value}`);}// β name: John// β age: 30
// Convert to Mapconst obj = { a: 1, b: 2 };const map = new Map(Object.entries(obj));console.log(map.get("a")); // β 1
// Filter entriesconst scores = { alice: 95, bob: 60, charlie: 92 };const passed = Object.fromEntries( Object.entries(scores).filter(([name, score]) => score >= 70),);console.log(passed); // β { alice: 95, charlie: 92 }
// Sort by valueconst data = { a: 3, b: 1, c: 2 };const sorted = Object.fromEntries( Object.entries(data).sort(([, a], [, b]) => a - b),);console.log(sorted); // β { b: 1, c: 2, a: 3 }Object.hasOwn() β
Checks if object has own property (ES2022+ replacement for hasOwnProperty).
// Basic usageconst obj = { a: 1 };console.log(Object.hasOwn(obj, "a")); // β trueconsole.log(Object.hasOwn(obj, "toString")); // β false (inherited)
// Safer than hasOwnProperty (works with null prototype)const nullProto = Object.create(null);nullProto.prop = "value";console.log(Object.hasOwn(nullProto, "prop")); // β true// nullProto.hasOwnProperty('prop'); // β Error: no hasOwnProperty method
// Check multiple propertiesconst user = { name: "John", age: 30 };const hasRequired = ["name", "age", "email"].every((prop) => Object.hasOwn(user, prop),);console.log(hasRequired); // β false (missing email)
// Filter own properties onlyconst obj = Object.create({ inherited: "value" });obj.own = "property";const ownProps = Object.keys(obj).filter((key) => Object.hasOwn(obj, key));console.log(ownProps); // β ['own']Object.hasOwnProperty() β οΈ
Legacy method to check own properties (use Object.hasOwn() in ES2022+).
// Basic usage (legacy)const obj = { a: 1 };console.log(obj.hasOwnProperty("a")); // β true
// β Problem: fails with null prototypeconst nullProto = Object.create(null);nullProto.prop = "value";// nullProto.hasOwnProperty('prop'); // TypeError!
// β
Safer: use Object.prototype.hasOwnProperty.call()const safe = Object.prototype.hasOwnProperty.call(nullProto, "prop");console.log(safe); // β true
// β
Best: use Object.hasOwn() (ES2022+)console.log(Object.hasOwn(nullProto, "prop")); // β trueProperty Descriptor Methods
Object.defineProperty() βοΈ
Defines new property or modifies existing property with descriptor.
// Basic usage - define propertyconst obj = {};Object.defineProperty(obj, "name", { value: "John", writable: true, enumerable: true, configurable: true,});console.log(obj.name); // β 'John'
// Read-only propertyconst config = {};Object.defineProperty(config, "apiKey", { value: "secret123", writable: false, enumerable: false, configurable: false,});config.apiKey = "new"; // β Silent failureconsole.log(config.apiKey); // β 'secret123'
// Getter and setterconst person = {};let _age = 0;Object.defineProperty(person, "age", { get() { return _age; }, set(value) { if (value < 0) throw new Error("Age cannot be negative"); _age = value; }, enumerable: true, configurable: true,});person.age = 30;console.log(person.age); // β 30// person.age = -5; // β Error: Age cannot be negative
// Computed propertyconst data = { x: 10, y: 20 };Object.defineProperty(data, "sum", { get() { return this.x + this.y; }, enumerable: true,});console.log(data.sum); // β 30data.x = 15;console.log(data.sum); // β 35Object.defineProperties() π§
Defines multiple properties at once.
// Define multiple propertiesconst obj = {};Object.defineProperties(obj, { name: { value: "John", writable: true, enumerable: true, }, age: { value: 30, writable: false, enumerable: true, }, fullName: { get() { return `${this.name} (${this.age})`; }, enumerable: true, },});console.log(obj.fullName); // β 'John (30)'
// Create immutable configurationconst settings = {};Object.defineProperties(settings, { apiUrl: { value: "https://api.example.com", writable: false, configurable: false, }, timeout: { value: 5000, writable: true, enumerable: true, },});Object.getOwnPropertyDescriptor() π
Returns property descriptor for own property.
// Get descriptorconst obj = {};Object.defineProperty(obj, "name", { value: "John", writable: false, enumerable: true, configurable: true,});const desc = Object.getOwnPropertyDescriptor(obj, "name");console.log(desc);// β { value: 'John', writable: false, enumerable: true, configurable: true }
// Check if property is writablefunction isWritable(obj, prop) { const desc = Object.getOwnPropertyDescriptor(obj, prop); return desc ? desc.writable !== false : false;}
// Get getter/setterconst objWithGetter = {};let _value = 0;Object.defineProperty(objWithGetter, "value", { get() { return _value; }, set(v) { _value = v; }, enumerable: true,});const desc = Object.getOwnPropertyDescriptor(objWithGetter, "value");console.log(typeof desc.get); // β 'function'Object.getOwnPropertyDescriptors() π
Returns all own property descriptors (ES2017+).
// Get all descriptorsconst obj = {};Object.defineProperties(obj, { a: { value: 1, writable: true }, b: { value: 2, writable: false }, c: { get() { return this.a + this.b; }, enumerable: true, },});const descriptors = Object.getOwnPropertyDescriptors(obj);console.log(descriptors);// β { a: {...}, b: {...}, c: {...} }
// Deep clone with descriptors (preserves getters/setters)function deepClone(obj) { return Object.create( Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj), );}const original = {};Object.defineProperty(original, "prop", { get() { return "computed"; }, enumerable: true,});const cloned = deepClone(original);console.log(cloned.prop); // β 'computed'Iteration Methods
Object.keys() with forβ¦of π
Iterate over object keys efficiently.
// Iterate keysconst obj = { a: 1, b: 2, c: 3 };for (const key of Object.keys(obj)) { console.log(`${key}: ${obj[key]}`);}
// Convert to array methodsconst data = { x: 10, y: 20, z: 30 };const doubled = Object.keys(data).reduce((acc, key) => { acc[key] = data[key] * 2; return acc;}, {});console.log(doubled); // β { x: 20, y: 40, z: 60 }Object.entries() with forβ¦of π
Iterate over key-value pairs.
// Iterate entriesconst user = { name: "John", age: 30, city: "NYC" };for (const [key, value] of Object.entries(user)) { console.log(`${key}: ${value}`);}
// Transform during iterationconst scores = { alice: 95, bob: 87, charlie: 92 };const letterGrades = Object.fromEntries( Object.entries(scores).map(([name, score]) => [ name, score >= 90 ? "A" : score >= 80 ? "B" : "C", ]),);console.log(letterGrades);// β { alice: 'A', bob: 'B', charlie: 'A' }Object.getOwnPropertyNames() π
Returns all own property names (including non-enumerable).
// Get all property namesconst obj = {};obj.visible = "visible";Object.defineProperty(obj, "hidden", { value: "hidden", enumerable: false,});console.log(Object.keys(obj)); // β ['visible']console.log(Object.getOwnPropertyNames(obj)); // β ['visible', 'hidden']
// Get all properties including symbolsconst sym = Symbol("key");const obj = { a: 1 };obj[sym] = "symbol value";Object.defineProperty(obj, "hidden", { value: "hidden", enumerable: false,});console.log(Object.getOwnPropertyNames(obj)); // β ['a', 'hidden'] (no symbols)Object.getOwnPropertySymbols() π£
Returns array of own symbol properties.
// Get symbol propertiesconst sym1 = Symbol("key1");const sym2 = Symbol("key2");const obj = { [sym1]: "value1", [sym2]: "value2", regular: "regular",};console.log(Object.getOwnPropertySymbols(obj)); // β [Symbol(key1), Symbol(key2)]console.log(Object.keys(obj)); // β ['regular'] (symbols not included)
// Access symbol valuesconst symbols = Object.getOwnPropertySymbols(obj);symbols.forEach((sym) => { console.log(obj[sym]);});// β value1// β value2
// Combine with regular propertiesconst allKeys = [ ...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj),];console.log(allKeys.length); // β 3Transformation Methods
Object.freeze() βοΈ
Freezes object: prevents adding, deleting, or modifying properties.
// Freeze objectconst obj = { a: 1, b: 2 };Object.freeze(obj);obj.c = 3; // β Silent failure (strict mode throws)obj.a = 99; // β Silent failuredelete obj.b; // β Silent failureconsole.log(obj); // β { a: 1, b: 2 } (unchanged)
// Check if frozenconsole.log(Object.isFrozen(obj)); // β true
// Shallow freeze (nested objects not frozen)const nested = { a: { b: 1 } };Object.freeze(nested);nested.a.b = 2; // β
Works! (nested object not frozen)console.log(nested.a.b); // β 2
// Deep freeze helperfunction deepFreeze(obj) { Object.getOwnPropertyNames(obj).forEach((prop) => { if (obj[prop] !== null && typeof obj[prop] === "object") { deepFreeze(obj[prop]); } }); return Object.freeze(obj);}Object.seal() π
Seals object: prevents adding or deleting properties, but allows modifying existing.
// Seal objectconst obj = { a: 1, b: 2 };Object.seal(obj);obj.c = 3; // β Silent failureobj.a = 99; // β
Works (can modify existing)delete obj.b; // β Silent failureconsole.log(obj); // β { a: 99, b: 2 }
// Check if sealedconsole.log(Object.isSealed(obj)); // β true
// Difference from freezeconst frozen = Object.freeze({ a: 1 });const sealed = Object.seal({ a: 1 });frozen.a = 2; // β Failssealed.a = 2; // β
WorksObject.preventExtensions() π«
Prevents adding new properties (can delete and modify existing).
// Prevent extensionsconst obj = { a: 1, b: 2 };Object.preventExtensions(obj);obj.c = 3; // β Silent failureobj.a = 99; // β
Worksdelete obj.b; // β
Worksconsole.log(obj); // β { a: 99 }
// Check if extensibleconsole.log(Object.isExtensible(obj)); // β false
// Comparison tableconst obj1 = { a: 1 };const obj2 = { a: 1 };const obj3 = { a: 1 };Object.freeze(obj1);Object.seal(obj2);Object.preventExtensions(obj3);// obj1: β add, β delete, β modify// obj2: β add, β delete, β
modify// obj3: β add, β
delete, β
modifyComparison Methods
Object.is() βοΈ
Determines if two values are the same value (better than === for NaN and -0).
// Basic comparisonconsole.log(Object.is(1, 1)); // β trueconsole.log(Object.is("a", "a")); // β trueconsole.log(Object.is({}, {})); // β false (different objects)
// NaN comparison (=== fails)console.log(NaN === NaN); // β falseconsole.log(Object.is(NaN, NaN)); // β true
// -0 and +0 comparison (=== fails)console.log(-0 === +0); // β trueconsole.log(Object.is(-0, +0)); // β falseconsole.log(Object.is(-0, -0)); // β true
// Use casesfunction isNegativeZero(value) { return Object.is(value, -0);}console.log(isNegativeZero(-0)); // β trueconsole.log(isNegativeZero(0)); // β false
// Array includes uses Object.is internallyconst arr = [NaN, -0];console.log(arr.includes(NaN)); // β true (uses Object.is)console.log(arr.indexOf(NaN)); // β -1 (uses ===)Prototype Methods
Object.getPrototypeOf() π
Returns prototype of specified object.
// Get prototypeconst obj = {};console.log(Object.getPrototypeOf(obj) === Object.prototype); // β true
// Check inheritance chainfunction Animal() {}function Dog() {}Dog.prototype = Object.create(Animal.prototype);const dog = new Dog();console.log(Object.getPrototypeOf(dog) === Dog.prototype); // β trueconsole.log(Object.getPrototypeOf(Dog.prototype) === Animal.prototype); // β true
// Traverse prototype chainfunction getPrototypeChain(obj) { const chain = []; let current = obj; while (current) { chain.push(current); current = Object.getPrototypeOf(current); } return chain;}const chain = getPrototypeChain([]);console.log(chain.length); // β 3 (Array, Object, null)Object.setPrototypeOf() π
Sets prototype of object (ES6+, use Object.create() when possible).
// Set prototypeconst proto = { greet: () => "Hello" };const obj = {};Object.setPrototypeOf(obj, proto);console.log(obj.greet()); // β 'Hello'
// β οΈ Performance warning: slow operation// Prefer Object.create() for new objectsconst better = Object.create(proto); // β
Faster
// Change prototype dynamicallyconst obj1 = { a: 1 };const obj2 = { b: 2 };Object.setPrototypeOf(obj1, obj2);console.log(obj1.b); // β 2 (inherited)Object.prototype.isPrototypeOf() π
Checks if object exists in prototype chain.
// Check prototype chainfunction Animal() {}function Dog() {}Dog.prototype = Object.create(Animal.prototype);const dog = new Dog();console.log(Animal.prototype.isPrototypeOf(dog)); // β trueconsole.log(Dog.prototype.isPrototypeOf(dog)); // β trueconsole.log(Object.prototype.isPrototypeOf(dog)); // β true
// vs instanceofconsole.log(dog instanceof Dog); // β trueconsole.log(dog instanceof Animal); // β trueModern Methods (ES6+)
Object.groupBy() π
Groups array elements by key (ES2023+, experimental).
// Group by propertyconst inventory = [ { name: "apples", type: "fruit", quantity: 10 }, { name: "bananas", type: "fruit", quantity: 5 }, { name: "carrots", type: "vegetable", quantity: 8 },];const grouped = Object.groupBy(inventory, (item) => item.type);console.log(grouped);// β {// fruit: [{ name: 'apples', ... }, { name: 'bananas', ... }],// vegetable: [{ name: 'carrots', ... }]// }
// Group by computed valueconst numbers = [1, 2, 3, 4, 5, 6];const evenOdd = Object.groupBy(numbers, (n) => (n % 2 === 0 ? "even" : "odd"));console.log(evenOdd);// β { odd: [1, 3, 5], even: [2, 4, 6] }Spread Operator (β¦) π
Modern way to copy and merge objects (ES2018+).
// Shallow copyconst original = { a: 1, b: 2 };const copy = { ...original };console.log(copy); // β { a: 1, b: 2 }
// Merge objectsconst obj1 = { a: 1, b: 2 };const obj2 = { b: 3, c: 4 };const merged = { ...obj1, ...obj2 };console.log(merged); // β { a: 1, b: 3, c: 4 } (obj2 overrides)
// Add propertiesconst user = { name: "John" };const withAge = { ...user, age: 30 };console.log(withAge); // β { name: 'John', age: 30 }
// Conditional propertiesconst includeExtra = true;const config = { base: "url", ...(includeExtra && { extra: "value" }),};console.log(config); // β { base: 'url', extra: 'value' }
// β Still shallow copyconst nested = { a: { b: 1 } };const shallow = { ...nested };shallow.a.b = 2;console.log(nested.a.b); // β 2 (mutated!)Best Practices
β Doβs
// β
Use Object.hasOwn() instead of hasOwnProperty (ES2022+)const obj = { a: 1 };if (Object.hasOwn(obj, "a")) { /* ... */}
// β
Use Object.assign() or spread for shallow copiesconst copy = { ...original };// orconst copy = Object.assign({}, original);
// β
Use Object.freeze() for constantsconst CONFIG = Object.freeze({ apiUrl: "https://api.example.com" });
// β
Use Object.entries() for iterationfor (const [key, value] of Object.entries(obj)) { // ...}
// β
Use Object.fromEntries() for transformationsconst transformed = Object.fromEntries( Object.entries(obj).map(([k, v]) => [k.toUpperCase(), v]),);
// β
Check property existence before accessif (Object.hasOwn(obj, "property")) { // safe to access}
// β
Use Object.create(null) for maps without prototype pollutionconst cleanMap = Object.create(null);β Donβts
// β Don't use hasOwnProperty directly (fails with null prototype)const nullProto = Object.create(null);// nullProto.hasOwnProperty('prop'); // TypeError!
// β Don't use Object.assign() for deep cloningconst nested = { a: { b: 1 } };const shallow = Object.assign({}, nested); // Only shallow copy!
// β Don't mutate frozen/sealed objectsconst frozen = Object.freeze({ a: 1 });// frozen.a = 2; // Silent failure or error
// β Don't use for...in without hasOwnProperty checkfor (const key in obj) { // Includes inherited properties! if (Object.hasOwn(obj, key)) { // Now safe }}
// β Don't use Object.setPrototypeOf() in hot code paths// Use Object.create() instead for better performance
// β Don't rely on Object.keys() order for numeric-like keysconst obj = { 2: "b", 1: "a", 10: "c" };console.log(Object.keys(obj)); // β ['1', '2', '10'] (sorted!)β οΈ Common Pitfalls
// β οΈ Object.assign() and spread are shallow copiesconst original = { a: { b: 1 } };const copy = { ...original };copy.a.b = 2;console.log(original.a.b); // β 2 (mutated original!)
// β οΈ Object.freeze() is shallowconst obj = { a: { b: 1 } };Object.freeze(obj);obj.a.b = 2; // β
Works! (nested not frozen)console.log(obj.a.b); // β 2
// β οΈ Object.keys() only returns enumerable own propertiesconst obj = {};Object.defineProperty(obj, "hidden", { value: "secret", enumerable: false,});console.log(Object.keys(obj)); // β [] (hidden not included)
// β οΈ Object.is() vs ===console.log(NaN === NaN); // β falseconsole.log(Object.is(NaN, NaN)); // β trueconsole.log(-0 === +0); // β trueconsole.log(Object.is(-0, +0)); // β false
// β οΈ Object.getOwnPropertyNames() includes non-enumerableconst obj = {};obj.visible = 1;Object.defineProperty(obj, "hidden", { value: 2, enumerable: false,});console.log(Object.keys(obj)); // β ['visible']console.log(Object.getOwnPropertyNames(obj)); // β ['visible', 'hidden']π Real-World Use Cases
// Configuration merging with defaultsfunction createConfig(userConfig) { const defaults = { apiUrl: "https://api.example.com", timeout: 5000, retries: 3, }; return Object.assign({}, defaults, userConfig);}
// Immutable state updatesfunction updateUser(state, updates) { return { ...state, ...updates };}
// Property validationfunction validateRequired(obj, required) { return required.every((prop) => Object.hasOwn(obj, prop));}
// Transform API responsefunction transformResponse(data) { return Object.fromEntries( Object.entries(data).map(([key, value]) => [ key.replace(/_/g, ""), // Remove underscores typeof value === "string" ? value.trim() : value, ]), );}
// Create read-only configurationconst CONFIG = Object.freeze({ API_URL: "https://api.example.com", VERSION: "1.0.0",});
// Deep equality check (simplified)function deepEqual(a, b) { if (Object.is(a, b)) return true; if (typeof a !== "object" || typeof b !== "object") return false; const keysA = Object.keys(a); const keysB = Object.keys(b); if (keysA.length !== keysB.length) return false; return keysA.every((key) => deepEqual(a[key], b[key]));}