JavaScript Data Structures
Implement hash table, array
How array works under the hood
Reference data types
Change slug and title
*exhaustive check?
Map - data structure, which holds key-value pairs (Dictionary, hash-table).
Keys can be objects, functions or primitives (Keys not converted to the string as in object, if you use a number in object, it gets converted to a string)
Maintains primary (insertion) order
Better performance for frequent additions/ deletions, iterations
Has size property
No prototype interference (Does NOT inherit from Object.prototype)
Keeps strong references (prevents garbage collection)
Test on 1000000 operations with complex-random keys and values.
const iterations = 1_000_000;
const keys = Array.from({ length: iterations }, (_, i) => `key_${i}_${Math.random().toString(36).substr(2, 9)}`);
const values = Array.from({ length: iterations }, (_, i) => ({ id: i, data: Math.random() }));
const obj = {};
const map = new Map();
// ===== INSERTION =====
console.log('📝 INSERTION (1M operations):\n');
console.time(' Object insert');
for (let i = 0; i < iterations; i++) {
obj[keys[i]] = values[i];
}
console.timeEnd(' Object insert');
// ~180ms
console.time(' Map insert');
for (let i = 0; i < iterations; i++) {
map.set(keys[i], values[i]);
}
console.timeEnd(' Map insert');
// ~95ms
console.log(' ⭐ Map wins: ~47% faster\n');
// ===== LOOKUP/GET =====
console.log('🔍 LOOKUP/GET (1M operations):\n');
console.time(' Object get');
for (let i = 0; i < iterations; i++) {
const v = obj[keys[i]];
}
console.timeEnd(' Object get');
// ~28ms
console.time(' Map get');
for (let i = 0; i < iterations; i++) {
const v = map.get(keys[i]);
}
console.timeEnd(' Map get');
// ~41ms
console.log(' ⭐ Object wins: ~32% faster\n');
// ===== ITERATION =====
console.log('🔁 ITERATION (1M entries):\n');
let objSum = 0;
console.time(' Object iteration');
for (const key in obj) {
objSum += obj[key].id;
}
console.timeEnd(' Object iteration');
// ~52ms
let mapSum = 0;
console.time(' Map iteration');
for (const [key, value] of map) {
mapSum += value.id;
}
console.timeEnd(' Map iteration');
// ~45ms
console.log(' ⭐ Map wins: ~13% faster\n');
// ===== DELETION =====
console.log('🗑️ DELETION (1M operations):\n');
console.time(' Object delete');
for (let i = 0; i < iterations; i++) {
delete obj[keys[i]];
}
console.timeEnd(' Object delete');
// ~420ms
console.time(' Map delete');
for (let i = 0; i < iterations; i++) {
map.delete(keys[i]);
}
console.timeEnd(' Map delete');
// ~105ms
console.log(' ⭐ Map wins: ~75% faster\n');Notes:
Mostly reads, rare writes? Use Object
Read-Heavy Workloads? Use Object
Need JSON serialization (converting a JavaScript object (or value) into a JSON-formatted string)? Use Object (Map doesn't serialize)
Mixed read/write, dynamic keys? Use Map (better overall performance)
Frequent additions AND deletions? Use Map (75% faster deletion)
Need Guaranteed Iteration Order? Use Map
Need Frequent Size Checks? Use Map
Weak Map - similar to Map, but keys are weakly referenced. Keeps weak references (allows garbage collection). Keys MUST be objects (no primitives). Use for: Private data, caching, DOM node metadata. NOT iterable, no .size, no .clear(), no iteration methods.
https://stackoverflow.com/questions/29413222/what-are-the-actual-uses-of-es6-weakmap
https://www.reddit.com/r/javascript/comments/1cb2vtv/askjs_why_use_weakmap_what_are_its_advantages/
Set - data structure, which stores unique values. Fast membership checking. Use for: Removing duplicates, membership tests, unique lists. Keeps strong references (prevents garbage collection)
Iterable, has .size, .clear(), .forEach()
Use for: Unique collections, deduplication, membership testing
Set Stores Any Type
const set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(2); // Duplicate - ignored
set.add(1); // Duplicate - ignored
console.log(set); // Set { 1, 2, 3 }
console.log(set.size); // 3 (not 5!)
// Array vs Set
const array = [1, 2, 3, 2, 1];
console.log(array.length); // 5 (duplicates kept)
const setFromArray = new Set(array);
console.log(setFromArray); // Set { 1, 2, 3 }
console.log(setFromArray.size); // 3 (duplicates removed)Weak Set - similar to Set, but values are weakly referenced. Use for: Tracking object membership without preventing garbage collection. Stores ONLY objects. Keeps weak references (allows garbage collection). Not iterable, no .size, no .clear(), no .forEach(). Use for: Tracking objects, tagging, memory-sensitive scenarios
Typed Arrays
// 8-bit integers (0-255)
const uint8 = new Uint8Array([1, 2, 3]);
// 32-bit integers
const int32 = new Int32Array(10); // 10 elements
// 64-bit floats
const float64 = new Float64Array([1.5, 2.7]);
// Shared between arrays (same buffer)
const buffer = new ArrayBuffer(16); // 16 bytes
const view1 = new Int32Array(buffer); // 4 elements (4 bytes each)
const view2 = new Uint8Array(buffer); // 16 elements (1 byte each)
// Use cases
// - Canvas/WebGL pixel data
// - Audio processing
// - File handling
// - WebAssembly interaction