Episode 1 — Fundamentals / 1.24 — Object Methods

1.24 — Object Methods: Quick Revision

Compact cheat sheet. Print-friendly.

How to use this material (instructions)

  1. Skim before labs or interviews.
  2. Drill gaps — reopen README.md -> 1.24.a...1.24.h.
  3. Practice1.24-Exercise-Questions.md.
  4. Polish answers1.24-Interview-Questions.md.

All 8 methods at a glance

MethodReturnsPurpose
Object.keys(obj)string[]Own enumerable property names
Object.values(obj)any[]Own enumerable property values
Object.entries(obj)[string, any][]Own enumerable [key, value] pairs
Object.fromEntries(iter)objectBuild object from [key, value] pairs
Object.assign(target, ...src)targetCopy props into target (mutates)
Object.freeze(obj)objMake object immutable (shallow)
Object.seal(obj)objFix shape, allow value changes (shallow)
Object.is(a, b)booleanSame-value equality (fixes NaN, +/-0)

Iteration trio

const obj = { name: "Alice", age: 30 };

Object.keys(obj);     // ["name", "age"]
Object.values(obj);   // ["Alice", 30]
Object.entries(obj);   // [["name", "Alice"], ["age", 30]]

Common rules for all three:

  • Own properties only (not inherited)
  • Enumerable only
  • String keys only (no Symbols)
  • Order: integer keys sorted, then string keys by insertion order

entries/fromEntries pipeline

// Filter
Object.fromEntries(Object.entries(obj).filter(([k, v]) => v > 0));

// Transform values
Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, v * 2]));

// Pick keys
Object.fromEntries(Object.entries(obj).filter(([k]) => allowed.includes(k)));

Object.assign quick reference

// Merge (safe — empty target)
const merged = Object.assign({}, defaults, overrides);

// Clone with extras
const clone = Object.assign({}, original, { extra: true });

// Mutate existing
Object.assign(target, source);  // target is modified and returned

Remember:

  • Shallow copy (nested objects shared by reference)
  • Later sources overwrite earlier (last wins)
  • Copies Symbol keys (unlike entries)
  • Triggers setters on target

assign vs spread

Object.assign(target, src){ ...src }
Mutates target?YesNo
Triggers setters?YesNo
Creates new object?Only if target is {}Always

Immutability hierarchy

preventExtensions  <  seal  <  freeze
     (weakest)                (strongest)
OperationpreventExtensionssealfreeze
Add propertiesNoNoNo
Delete propertiesYesNoNo
Modify valuesYesYesNo
Reconfigure descriptorsYesNoNo

All three are SHALLOW. Nested objects unaffected.


freeze vs const

constObject.freeze()
ProtectsVariable bindingObject contents
Prevents reassignment?YesNo
Prevents property mutation?NoYes

Use both: const CONFIG = Object.freeze({ ... })


Object.is vs === vs ==

=====Object.is()
Type coercion?YesNoNo
NaN === NaNfalsefalsetrue
+0 === -0truetruefalse

Rule of thumb: Use === everywhere. Use Object.is for NaN-safe comparisons (React does this).


Checking object state

Object.isFrozen(obj);      // true if frozen
Object.isSealed(obj);      // true if sealed (or frozen)
Object.isExtensible(obj);  // true if can add properties

Common patterns

Empty check

Object.keys(obj).length === 0

Property count

Object.keys(obj).length

Value existence

Object.values(obj).includes(searchValue)

Sum values

Object.values(obj).reduce((sum, v) => sum + v, 0)

Object to Map

new Map(Object.entries(obj))

Map to Object

Object.fromEntries(map)

Object to query string

Object.entries(obj).map(([k, v]) => `${k}=${v}`).join("&")

Deep freeze

function deepFreeze(obj) {
  Object.freeze(obj);
  Object.values(obj).forEach(v => {
    if (v && typeof v === "object" && !Object.isFrozen(v)) deepFreeze(v);
  });
  return obj;
}

Shallow clone

{ ...obj }                    // spread (preferred)
Object.assign({}, obj)        // assign

Deep clone

structuredClone(obj)           // modern (recommended)
JSON.parse(JSON.stringify(obj)) // JSON-safe data only

What each method copies/skips

OwnEnumerable onlyString keysSymbol keys
Object.keys()YesYesYesNo
Object.values()YesYesYesNo
Object.entries()YesYesYesNo
Object.assign()YesYesYesYes
{ ...obj }YesYesYesYes
for...in+inheritedYesYesNo

Master workflow

  1. InspectObject.keys / values / entries to examine an object
  2. Transformentries -> map/filter -> fromEntries pipeline
  3. Copy{ ...obj } for shallow; structuredClone for deep
  4. Merge{ ...defaults, ...overrides } or Object.assign({}, defaults, overrides)
  5. LockObject.seal for fixed shape; Object.freeze for full immutability
  6. Compare=== normally; Object.is for NaN-safe checks

End of 1.24 quick revision.