একটি সাধারণ object আর array বেশিরভাগ দরকার মেটায়, কিন্তু আরো চারটি built-in structure নির্দিষ্ট সমস্যা সমাধান করে যা কোনোটাই ভালোভাবে করে না।
একটি সাধারণ object-এর key সবসময় string-এ রূপান্তরিত হয়। একটি Map যেকোনো type-এর key অনুমতি দেয় — একটি object, একটি function, এমনকি আরেকটি Map।
const userRoles = new Map()
const user1 = { name: 'Sam' }
userRoles.set(user1, 'admin')
userRoles.set('guest', 'viewer')
userRoles.get(user1) // "admin"
userRoles.size // 2
for (const [key, value] of userRoles) {
console.log(key, value)
}একটি Set ডুপ্লিকেট স্বয়ংক্রিয়ভাবে সরিয়ে মানের একটি list সংরক্ষণ করে।
const uniqueTags = new Set(['js', 'css', 'js', 'html', 'css'])
console.log(uniqueTags) // Set(3) { 'js', 'css', 'html' }
console.log(uniqueTags.size) // 3
uniqueTags.add('react')
uniqueTags.has('css') // true
uniqueTags.delete('html')const numbers = [1, 2, 2, 3, 3, 3]
const unique = [...new Set(numbers)]
// [1, 2, 3]WeakMap আর WeakSet এদের non-weak সমতুল্যর মতোই কাজ করে, কিন্তু শুধু object-কে key/value হিসেবে accept করে, আর অন্য কিছু আর reference না করলে সেই object-গুলোকে garbage collected হতে (আগের Memory Management lesson-এ কভার করা) বাধা দেয় না। এটা এদের memory leak না ঘটিয়ে একটি object-এ অতিরিক্ত data যুক্ত করার জন্য useful বানায়।
const cache = new WeakMap()
function process(obj) {
if (cache.has(obj)) return cache.get(obj)
const result = expensiveComputation(obj)
cache.set(obj, result)
return result
}
// obj পরে কোডের অন্য জায়গায় discard হলে,
// এর cache entry-ও garbage collected হতে পারে — একটি সাধারণ Map এটা চিরকাল ধরে রাখত| Structure | Key/value | Iterable? | Garbage collection আটকায়? |
|---|---|---|---|
| Map | যেকোনো type | হ্যাঁ | হ্যাঁ |
| Set | যেকোনো type (শুধু value) | হ্যাঁ | হ্যাঁ |
| WeakMap | শুধু object | না | না |
| WeakSet | শুধু object | না | না |