{} === {} is finally True.
For 30 years, JavaScript developers have struggled with object identity. Infinite loops in useEffect, unnecessary React re-renders, and complex memoization checks.
Enter Records & Tuples: Native, immutable data structures that compare by content, not reference.
02. The Hash Syntax
Simply put a hash # before your object or array literal. That's it. It is now deeply immutable and compares by value.
Old Object (Reference)
const a = { x: 1 };
const b = { x: 1 };
console.log(a === b);
// ❌ False (Different memory address)
New Record (Value)
const a = #{ x: 1 };
const b = #{ x: 1 };
console.log(a === b);
// ✅ True (Same content)
03. The React Revolution
This kills useMemo for 90% of use cases. If you pass a Record to a child component, React's shallow comparison just works. No more prevProps.obj === nextProps.obj failures.
<Chart config={#{ theme: 'dark', data: #[1, 2, 3] }} />
04. The Killer Feature: Composite Map Keys
Previously, using an object as a Map key relied on its reference. You couldn't create a "fresh" object and look up a value. With Records, Value Object keys are finally possible.
Before (Broken)
const cache = new Map();
cache.set({x:1, y:2}, "Hit!");
// Returns undefined because this object
// is a DIFFERENT reference
cache.get({x:1, y:2}); // ❌ undefined
After (Works)
const cache = new Map();
cache.set(#{x:1, y:2}, "Hit!");
// Works because the Record is compared
// by value, not reference
cache.get(#{x:1, y:2}); // ✅ "Hit!"
05. How it Works: Structural Sharing
You might think identifying two deep objects as "equal" is slow (O(N) recursion). But engine implementers use Structural Sharing.
When you modify a Record: const newRec = #{ ...oldRec, b: 2 }
The engine doesn't copy the entire tree. It points newRec to the same memory locations as oldRec for all unchanged properties.
Comparison is often as fast as O(1) hashing or pointer checking for shared sub-trees.
06. The Senior Engineer's Take
Implementation Details Matter
Under the hood, engines like V8 use "structural sharing" (similar to Immutable.js tries) to keep memory usage low.
Warning: Records & Tuples are strictly immutable. You cannot mutate them. If you need mutation, you must create a new version (spread operator works: #{ ...old, newProp: 1 }).