JavaScript?Map函數(shù)的二度補(bǔ)充(附詳細(xì)代碼)
Map
在 JavaScript 生態(tài)中,Map 作為 ES6 引入的核心數(shù)據(jù)結(jié)構(gòu),常被開發(fā)者當(dāng)作"高級對象"使用,卻鮮少有人真正觸及它的設(shè)計(jì)本質(zhì)與拓展?jié)摿?。本文將從基礎(chǔ)到深層,對 Map 進(jìn)行全方位"回爐深造",挖掘其被忽視的價(jià)值。
一、基礎(chǔ)用法的再審視:不止于鍵值存儲
Map 的基礎(chǔ)語法看似簡單,實(shí)則暗藏與對象(Object)的本質(zhì)差異,這些差異正是其獨(dú)特價(jià)值的起點(diǎn)。
核心語法回顧
// 初始化方式
const map = new Map();
const mapFromArray = new Map([['key1', 'value1'], ['key2', 'value2']]);
const mapFromMap = new Map(existingMap);
// 核心操作
map.set('name', 'map'); // 添加/更新鍵值對,返回Map本身(支持鏈?zhǔn)秸{(diào)用)
map.get('name'); // 獲取值,不存在則返回undefined
map.has('name'); // 判斷鍵是否存在,返回布爾值
map.delete('name'); // 刪除鍵值對,返回操作結(jié)果
map.clear(); // 清空所有鍵值對
map.size; // 獲取鍵值對數(shù)量(注意:無括號,區(qū)別于數(shù)組length)
與對象的本質(zhì)區(qū)別(常被忽略的細(xì)節(jié))
鍵的類型自由度:
Map的鍵可以是任意類型(原始值、對象、函數(shù)等),而對象的鍵會被強(qiáng)制轉(zhuǎn)換為字符串(對象鍵會被轉(zhuǎn)為[object Object])。const obj = {}; const key = { id: 1 }; obj[key] = 'value'; console.log(Object.keys(obj)); // ["[object Object]"] const map = new Map(); map.set(key, 'value'); map.get(key); // "value"(精準(zhǔn)匹配引用)迭代順序:
Map嚴(yán)格按照鍵的插入順序迭代,而對象在 ES6 前無明確順序(數(shù)字鍵會被優(yōu)先排序)。性能特性:在頻繁增刪鍵值對的場景中,
Map的性能表現(xiàn)優(yōu)于對象(V8 引擎對Map的哈希表實(shí)現(xiàn)更高效)。內(nèi)存占用:相同數(shù)量的鍵值對,
Map通常比對象占用更少內(nèi)存(尤其鍵值對數(shù)量動態(tài)變化時(shí))。
二、應(yīng)用場景的深度挖掘:超越常規(guī)存儲
Map 的應(yīng)用遠(yuǎn)不止"存儲鍵值對",其特性使其在特定場景中成為最優(yōu)解。
1. 復(fù)雜鍵的精準(zhǔn)映射
當(dāng)需要以對象、函數(shù)等作為鍵時(shí),Map 是唯一選擇。例如在緩存場景中:
// 緩存函數(shù)計(jì)算結(jié)果(以函數(shù)和參數(shù)作為復(fù)合鍵)
const cache = new Map();
function compute(keyObj) {
// 用對象作為鍵,直接關(guān)聯(lián)計(jì)算結(jié)果
if (cache.has(keyObj)) {
return cache.get(keyObj);
}
const result = heavyComputation(keyObj); // 假設(shè)的耗時(shí)計(jì)算
cache.set(keyObj, result);
return result;
}
2. 有序鍵值對的迭代處理
需要保留插入順序并批量處理時(shí),Map 的迭代能力遠(yuǎn)超對象:
const steps = new Map([
['init', () => console.log('初始化')],
['process', () => console.log('處理中')],
['complete', () => console.log('完成')]
]);
// 按插入順序執(zhí)行流程
for (const [name, step] of steps) {
console.log(`執(zhí)行步驟:${name}`);
step();
}
3. 數(shù)據(jù)去重與關(guān)聯(lián)
利用 Map 鍵的唯一性,可高效實(shí)現(xiàn)復(fù)雜數(shù)據(jù)去重:
// 對對象數(shù)組去重(根據(jù)id字段)
const users = [
{ id: 1, name: 'a' },
{ id: 1, name: 'b' },
{ id: 2, name: 'c' }
];
const uniqueUsers = new Map();
users.forEach(user => {
if (!uniqueUsers.has(user.id)) {
uniqueUsers.set(user.id, user);
}
});
[...uniqueUsers.values()]; // 去重后的數(shù)組
4. 替代對象作為配置容器
在需要動態(tài)鍵且需頻繁檢查鍵存在性的場景(如插件配置):
const pluginConfig = new Map();
// 注冊插件配置
pluginConfig.set('logger', { level: 'info' });
pluginConfig.set('router', { mode: 'history' });
// 安全獲取配置(避免對象的undefined屬性鏈問題)
function getPluginConfig(name) {
return pluginConfig.get(name) || defaultConfig;
}
三、設(shè)計(jì)思想的溯源:為何需要 Map?
Map 的誕生并非偶然,而是 JavaScript 對"鍵值映射"這一基礎(chǔ)需求的規(guī)范化實(shí)現(xiàn),其設(shè)計(jì)思想可從三個維度解讀:
1. 彌補(bǔ)對象作為映射表的缺陷
在 ES6 前,開發(fā)者被迫用對象模擬映射表,但對象存在天然局限:鍵類型受限、無明確順序、原型鏈污染風(fēng)險(xiǎn)('__proto__' 鍵會干擾原型)。Map 從根源解決了這些問題:
- 鍵的類型無關(guān)性(突破字符串限制)
- 完全隔離于原型鏈(
map.has('__proto__')始終為 false,除非主動設(shè)置) - 內(nèi)置
size屬性(無需手動計(jì)算鍵數(shù)量)
2. 函數(shù)式編程的配套設(shè)施
Map 提供了原生迭代器(keys()、values()、entries()),完美適配 for...of、擴(kuò)展運(yùn)算符(...)等 ES6 特性,使其能無縫融入函數(shù)式編程范式:
// 函數(shù)式轉(zhuǎn)換:Map → 過濾 → 映射 → 數(shù)組
const filtered = [...new Map([[1, 'a'], [2, 'b'], [3, 'c']])
.entries()]
.filter(([k]) => k > 1)
.map(([k, v]) => ({ [k]: v }));
3. 面向數(shù)據(jù)的結(jié)構(gòu)化設(shè)計(jì)
Map 將"鍵值對集合"抽象為獨(dú)立數(shù)據(jù)類型,使其能作為一等公民參與運(yùn)算(如作為函數(shù)參數(shù)/返回值、與其他數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換),這與 JavaScript 向"數(shù)據(jù)驅(qū)動"發(fā)展的方向高度契合。
四、鍵值對的拓展應(yīng)用:從基礎(chǔ)到高級
Map 的鍵值對能力可通過組合與變形,實(shí)現(xiàn)更復(fù)雜的業(yè)務(wù)邏輯。
1. 多維度索引(復(fù)合鍵技術(shù))
通過將多個值組合為鍵(如數(shù)組),實(shí)現(xiàn)多條件映射:
// 存儲不同用戶在不同場景下的權(quán)限
const permissions = new Map();
// 復(fù)合鍵:[userId, scene]
permissions.set([1, 'admin'], ['read', 'write']);
permissions.set([1, 'guest'], ['read']);
// 查詢權(quán)限
function getPermission(userId, scene) {
// 注意:數(shù)組作為鍵時(shí)需引用相同實(shí)例,或用字符串序列化
const key = [...permissions.keys()].find(k => k[0] === userId && k[1] === scene);
return key ? permissions.get(key) : [];
}
// 優(yōu)化方案:用字符串序列化復(fù)合鍵
permissions.set(`${1}|admin`, ['read', 'write']); // 鍵為"1|admin"
2. 雙向映射(Inverse Map)
基于 Map 構(gòu)建雙向鍵值映射,實(shí)現(xiàn)鍵值互查:
class TwoWayMap {
constructor() {
this.forward = new Map(); // key → value
this.backward = new Map(); // value → key
}
set(key, value) {
this.forward.set(key, value);
this.backward.set(value, key);
}
get(key) { return this.forward.get(key); }
getKey(value) { return this.backward.get(value); }
}
// 應(yīng)用:中英文映射
const dict = new TwoWayMap();
dict.set('hello', '你好');
dict.get('hello'); // "你好"
dict.getKey('你好'); // "hello"
3. 過期鍵自動清理(TTL 機(jī)制)
結(jié)合定時(shí)器實(shí)現(xiàn)帶過期時(shí)間的 Map:
class TTLMap extends Map {
set(key, value, ttl = 1000) { // ttl:毫秒
super.set(key, value);
// 清除舊定時(shí)器
if (this.timeouts.has(key)) {
clearTimeout(this.timeouts.get(key));
}
// 設(shè)置新定時(shí)器
const timeout = setTimeout(() => this.delete(key), ttl);
this.timeouts.set(key, timeout);
}
constructor() {
super();
this.timeouts = new Map(); // 存儲定時(shí)器
}
}
// 應(yīng)用:臨時(shí)緩存
const tempCache = new TTLMap();
tempCache.set('tempData', 'value', 2000); // 2秒后自動刪除
五、鍵值對的拓展場景及解決方案
針對實(shí)際開發(fā)中的復(fù)雜場景,Map 可通過封裝實(shí)現(xiàn)更強(qiáng)大的功能。
場景1:多級嵌套數(shù)據(jù)的高效訪問
問題:深層嵌套對象(如 obj.a.b.c)訪問時(shí)需多次判空,且修改不便。
方案:用 Map 扁平化存儲路徑與值,配合路徑解析:
class PathMap extends Map {
// 以數(shù)組作為路徑鍵,如 ['a', 'b', 'c']
setPath(path, value) {
super.set([...path], value);
}
getPath(path) {
return super.get([...path]);
}
// 從嵌套對象初始化
fromNested(obj, parentPath = []) {
for (const [key, value] of Object.entries(obj)) {
const currentPath = [...parentPath, key];
if (typeof value === 'object' && value !== null) {
this.fromNested(value, currentPath);
} else {
this.setPath(currentPath, value);
}
}
}
}
// 使用
const nestedObj = { a: { b: { c: 1 } }, d: 2 };
const pathMap = new PathMap();
pathMap.fromNested(nestedObj);
pathMap.getPath(['a', 'b', 'c']); // 1(無需判空)
場景2:高頻讀寫的狀態(tài)管理
問題:前端狀態(tài)管理需頻繁更新并觸發(fā)響應(yīng),普通對象性能不足。
方案:基于 Map 封裝響應(yīng)式狀態(tài)容器:
class ReactiveMap extends Map {
constructor() {
super();
this.listeners = new Set(); // 存儲更新監(jiān)聽器
}
set(key, value) {
const oldValue = this.get(key);
if (oldValue !== value) {
super.set(key, value);
this.notify(key, value, oldValue); // 觸發(fā)更新
}
}
notify(key, newValue, oldValue) {
this.listeners.forEach(listener => {
listener(key, newValue, oldValue);
});
}
subscribe(listener) {
this.listeners.add(listener);
return () => this.listeners.delete(listener); // 返回取消訂閱函數(shù)
}
}
// 應(yīng)用:組件狀態(tài)管理
const state = new ReactiveMap();
const unsubscribe = state.subscribe((key, value) => {
console.log(`狀態(tài)${key}更新為${value}`);
});
state.set('count', 1); // 觸發(fā)通知
場景3:大數(shù)據(jù)量的分組與統(tǒng)計(jì)
問題:對海量數(shù)據(jù)按多維度分組統(tǒng)計(jì)時(shí),傳統(tǒng)循環(huán)效率低。
方案:用 Map 作為分組容器,利用鍵的唯一性高效聚合:
// 統(tǒng)計(jì)不同部門不同性別的員工數(shù)量
const employees = [
{ dept: 'IT', gender: 'male' },
{ dept: 'IT', gender: 'female' },
{ dept: 'HR', gender: 'female' }
];
const stats = new Map();
for (const emp of employees) {
const key = `${emp.dept}|${emp.gender}`;
stats.set(key, (stats.get(key) || 0) + 1);
}
// 結(jié)果:Map { "IT|male" => 1, "IT|female" => 1, "HR|female" => 1 }
六、重新認(rèn)識 Map 的價(jià)值
Map 并非對象的簡單替代品,而是 JavaScript 提供的"鍵值映射"基礎(chǔ)設(shè)施。其價(jià)值在于:
- 基礎(chǔ)層:解決對象作為映射表的固有缺陷,提供更規(guī)范的鍵值操作。
- 應(yīng)用層:在有序存儲、復(fù)雜鍵映射、迭代處理等場景中提升開發(fā)效率。
- 拓展層:通過封裝可實(shí)現(xiàn)雙向映射、TTL 緩存、響應(yīng)式狀態(tài)等高級功能。
二度補(bǔ)充
在 JavaScript 中,Map 的設(shè)計(jì)思想遠(yuǎn)不止前文提到的層面,其深層邏輯還涉及對“映射關(guān)系”的抽象、對“動態(tài)性”的原生支持,以及對“數(shù)據(jù)操作范式”的補(bǔ)充。這些設(shè)計(jì)思想決定了它在特定業(yè)務(wù)場景中不可替代的價(jià)值。以下從更深入的設(shè)計(jì)思想出發(fā),結(jié)合業(yè)務(wù)場景說明如何判斷何時(shí)該選擇 Map。
一、被忽視的Map設(shè)計(jì)思想:從語言本質(zhì)看價(jià)值
1. 對“映射關(guān)系”的純粹抽象
對象(Object)在 JavaScript 中是“屬性集合”,自帶原型鏈、toString 等內(nèi)置屬性,本質(zhì)上是“復(fù)合型數(shù)據(jù)載體”;而 Map 是對“鍵值映射”這一數(shù)學(xué)概念的純粹實(shí)現(xiàn)——它沒有多余的內(nèi)置屬性,唯一職責(zé)就是維護(hù)“鍵→值”的對應(yīng)關(guān)系。
設(shè)計(jì)邏輯:將“映射”從對象的復(fù)雜功能中剝離,形成單一職責(zé)的數(shù)據(jù)結(jié)構(gòu)。這種純粹性使其在需要“干凈的鍵值關(guān)聯(lián)”場景中更可靠。
2. 原生支持“動態(tài)鍵管理”
對象的鍵本質(zhì)上是靜態(tài)屬性(即使動態(tài)添加,也會受原型鏈、屬性描述符等限制),而 Map 從 API 設(shè)計(jì)上就為動態(tài)鍵場景優(yōu)化:
set/delete是原子操作,且返回操作結(jié)果(便于鏈?zhǔn)秸{(diào)用或判斷執(zhí)行狀態(tài));size屬性實(shí)時(shí)反映鍵值對數(shù)量(無需通過Object.keys().length計(jì)算);- 迭代器(
entries()/keys()/values())直接基于當(dāng)前狀態(tài)生成,避免遍歷過程中修改數(shù)據(jù)導(dǎo)致的異常(如對象for...in遍歷刪除屬性可能跳過元素)。
設(shè)計(jì)邏輯:為“鍵值對頻繁增刪、數(shù)量動態(tài)變化”的場景提供原生高效支持。
3. 對“非字符串鍵”的語義化支持
對象的鍵會被強(qiáng)制轉(zhuǎn)換為字符串(如 Symbol 作為鍵是 ES6 后補(bǔ)充的特性,且兼容性有限),而 Map 對鍵的比較采用“SameValueZero”算法(與 Object.is 邏輯一致,僅 NaN 被視為與自身相等),支持任意類型鍵的精準(zhǔn)匹配。
設(shè)計(jì)邏輯:突破“字符串鍵”的限制,讓“鍵”可以是業(yè)務(wù)語義中的“實(shí)體”(如對象、函數(shù)),而非必須轉(zhuǎn)化為字符串的“標(biāo)識”。
4. 與“迭代協(xié)議”的深度融合
Map 是原生可迭代對象(實(shí)現(xiàn)了 [Symbol.iterator]),其迭代器直接返回鍵值對,且與 for...of、擴(kuò)展運(yùn)算符(...)、Array.from 等無縫銜接。這種設(shè)計(jì)讓“遍歷映射關(guān)系”成為原生能力,無需像對象那樣先通過 Object.entries() 轉(zhuǎn)換。
設(shè)計(jì)邏輯:將“迭代”作為映射關(guān)系的基礎(chǔ)操作,降低批量處理鍵值對的成本。
二、從業(yè)務(wù)場景到Map的選擇:決策依據(jù)與實(shí)例
選擇 Map 還是對象(或其他數(shù)據(jù)結(jié)構(gòu)),核心是判斷業(yè)務(wù)場景是否匹配 Map 的設(shè)計(jì)思想。以下是典型業(yè)務(wù)場景的決策邏輯:
場景1:鍵是“業(yè)務(wù)實(shí)體”而非“字符串標(biāo)識”
業(yè)務(wù)特征:需要以對象、函數(shù)等“實(shí)體”作為鍵,而非提前定義的字符串。例如:
- 緩存函數(shù)的計(jì)算結(jié)果(以函數(shù)和參數(shù)對象作為鍵);
- 跟蹤 DOM 元素的狀態(tài)(以 DOM 節(jié)點(diǎn)作為鍵);
- 關(guān)聯(lián)兩個對象的映射關(guān)系(如“用戶實(shí)例→權(quán)限實(shí)例”)。
為什么選 Map:對象的鍵會將實(shí)體轉(zhuǎn)為字符串(如 [object Object]),導(dǎo)致鍵沖突;而 Map 能精準(zhǔn)匹配實(shí)體引用。
實(shí)例:跟蹤 DOM 元素的點(diǎn)擊次數(shù)
// 錯誤方案:用對象存儲,鍵會被轉(zhuǎn)為字符串,導(dǎo)致所有元素共用一個鍵
const clickCounts = {};
document.querySelectorAll('button').forEach(btn => {
clickCounts[btn] = 0; // 所有 btn 都會被轉(zhuǎn)為 "[object HTMLButtonElement]"
btn.onclick = () => clickCounts[btn]++; // 所有按鈕的計(jì)數(shù)會疊加
});
// 正確方案:用 Map 精準(zhǔn)關(guān)聯(lián) DOM 元素
const clickCounts = new Map();
document.querySelectorAll('button').forEach(btn => {
clickCounts.set(btn, 0);
btn.onclick = () => clickCounts.set(btn, clickCounts.get(btn) + 1);
});
場景2:鍵值對需要“動態(tài)增刪且頻繁統(tǒng)計(jì)數(shù)量”
業(yè)務(wù)特征:鍵的數(shù)量不固定,需要頻繁添加/刪除,且需實(shí)時(shí)知道當(dāng)前有多少有效鍵。例如:
- 購物車(商品可動態(tài)添加/刪除,需實(shí)時(shí)顯示商品數(shù)量);
- 在線用戶列表(用戶隨時(shí)上下線,需實(shí)時(shí)統(tǒng)計(jì)在線人數(shù));
- 臨時(shí)任務(wù)隊(duì)列(任務(wù)動態(tài)加入/完成,需監(jiān)控剩余任務(wù)數(shù))。
為什么選 Map:對象需通過 Object.keys(obj).length 計(jì)算數(shù)量(性能差,且會遍歷原型鏈上的屬性),而 Map.size 是原生屬性,實(shí)時(shí)更新且高效;delete 操作也更簡潔(無需 delete obj.key 這種特殊語法)。
實(shí)例:在線用戶管理
class OnlineUsers {
constructor() {
this.users = new Map(); // 鍵:用戶ID(number),值:用戶信息對象
}
userOnline(userId, info) {
this.users.set(userId, info);
}
userOffline(userId) {
this.users.delete(userId);
}
getOnlineCount() {
return this.users.size; // 直接獲取,無需計(jì)算
}
getOnlineUsers() {
return [...this.users.values()]; // 快速轉(zhuǎn)為數(shù)組
}
}
場景3:需要“保留插入順序并按順序迭代”
業(yè)務(wù)特征:鍵值對的插入順序有業(yè)務(wù)意義,需按插入順序遍歷或執(zhí)行操作。例如:
- 表單步驟流程(按用戶添加順序執(zhí)行步驟);
- 日志記錄(按時(shí)間順序存儲,按順序打?。?/li>
- 路由匹配規(guī)則(按注冊順序匹配優(yōu)先級)。
為什么選 Map:對象在 ES6 后雖對字符串鍵有順序優(yōu)化,但數(shù)字鍵會被優(yōu)先排序(如 { 3: 'a', 1: 'b' } 遍歷順序是 1,3),且無法保證所有場景的順序一致性;而 Map 嚴(yán)格按插入順序迭代,無例外。
實(shí)例:路由規(guī)則匹配
// 路由規(guī)則按注冊順序匹配(先注冊的規(guī)則優(yōu)先級高)
const routes = new Map();
// 注冊路由(順序:首頁 → 列表 → 詳情)
routes.set('/', () => renderHome());
routes.set('/list', () => renderList());
routes.set('/detail/:id', () => renderDetail());
// 匹配當(dāng)前路徑(按注冊順序查找第一個匹配的規(guī)則)
function matchRoute(path) {
for (const [routePath, handler] of routes) {
if (pathMatches(routePath, path)) { // 假設(shè)的匹配函數(shù)
return handler();
}
}
}
場景4:需要“避免鍵名沖突與原型污染”
業(yè)務(wù)特征:鍵名是動態(tài)生成的(如用戶輸入、接口返回的字段),可能包含特殊值(如 __proto__、toString)。例如:
- 存儲用戶自定義配置(鍵名由用戶輸入);
- 緩存接口返回的動態(tài)字段(字段名不確定)。
為什么選 Map:對象的鍵若為 __proto__ 會修改原型鏈(如 obj.__proto__ = {} 會污染原型),而 Map 完全隔離于原型鏈,map.set('__proto__', 'value') 僅作為普通鍵值對存儲,無副作用。
實(shí)例:安全存儲用戶自定義配置
// 危險(xiǎn)方案:用戶輸入的鍵可能包含 __proto__
const userConfig = {};
const userInputKey = '__proto__'; // 惡意用戶輸入
userConfig[userInputKey] = 'polluted';
console.log({}.toString); // 可能被污染(取決于環(huán)境)
// 安全方案:用 Map 存儲,鍵名無特殊含義
const userConfig = new Map();
userConfig.set(userInputKey, 'safe');
console.log(Map.prototype.get('__proto__')); // undefined(無原型污染)
場景5:需要“鍵值對的批量轉(zhuǎn)換與過濾”
業(yè)務(wù)特征:需對鍵值對進(jìn)行批量處理(如過濾、映射、合并),且希望操作簡潔。例如:
- 從現(xiàn)有映射中篩選符合條件的鍵值對;
- 將鍵值對轉(zhuǎn)換為其他格式(如對象、數(shù)組);
- 合并多個映射關(guān)系(去重或覆蓋)。
為什么選 Map:Map 可直接通過擴(kuò)展運(yùn)算符轉(zhuǎn)為數(shù)組([...map]),無縫對接數(shù)組的 filter/map/reduce 等方法,而對象需先通過 Object.entries() 轉(zhuǎn)換,操作鏈更長。
實(shí)例:篩選并轉(zhuǎn)換符合條件的鍵值對
// 從用戶權(quán)限映射中篩選出“編輯權(quán)限”并轉(zhuǎn)為對象
const userPermissions = new Map([
['user1', ['read', 'write']],
['user2', ['read']],
['user3', ['write']]
]);
// 直接轉(zhuǎn)換:Map → 數(shù)組 → 過濾 → 轉(zhuǎn)為對象
const canWriteUsers = Object.fromEntries(
[...userPermissions].filter(([_, permissions]) => permissions.includes('write'))
);
// 結(jié)果:{ user1: ['read', 'write'], user3: ['write'] }
三、總結(jié):選擇Map的核心決策框架
判斷是否用 Map,可通過以下問題快速決策:
- 鍵是否需要是字符串以外的類型(如對象、函數(shù)、
Symbol)?→ 是 → 用Map - 鍵值對是否需要頻繁增刪,且需實(shí)時(shí)知道數(shù)量?→ 是 → 用
Map - 插入順序是否對業(yè)務(wù)邏輯有影響?→ 是 → 用
Map - 鍵名是否可能是動態(tài)生成的(如用戶輸入),存在沖突風(fēng)險(xiǎn)?→ 是 → 用
Map - 是否需要對鍵值對進(jìn)行批量過濾、轉(zhuǎn)換等操作?→ 是 → 優(yōu)先用
Map
反之,若鍵是固定的字符串/符號、數(shù)量少且靜態(tài)、無需關(guān)注順序,則對象更簡潔(如 { name: 'xxx', age: 18 } 這種配置)。
Map 的設(shè)計(jì)思想本質(zhì)是“為動態(tài)、復(fù)雜的鍵值映射場景提供原生解決方案”,理解這一點(diǎn),就能在業(yè)務(wù)中精準(zhǔn)判斷何時(shí)該讓 Map 發(fā)揮價(jià)值。
真正的"二度回爐",是從"知道 Map"到"理解 Map 設(shè)計(jì)本質(zhì)",再到"能基于 Map 構(gòu)建符合場景的解決方案"。當(dāng)我們跳出"對象思維"的局限,Map 會成為處理復(fù)雜數(shù)據(jù)關(guān)系的強(qiáng)大工具。
到此這篇關(guān)于JavaScript Map函數(shù)的文章就介紹到這了,更多相關(guān)JS Map函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于原生CSS+JS實(shí)現(xiàn)一個標(biāo)簽輸入框
在各種框架大行其道的氛圍下,有些原生的屬性和方法可能都不太關(guān)注了,這也不失為是一種損失。本文就將利用原生CSS+JS實(shí)現(xiàn)一個簡單的標(biāo)簽輸入框,感興趣的可以了解一下2022-04-04
微信小程序template模板與component組件的區(qū)別和使用詳解
這篇文章主要介紹了微信小程序template模板與component組件的區(qū)別和使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
javascript中import和export用法示例總結(jié)
在 ES6 之前,社區(qū)制定了一些模塊加載方案,最主要的有 CommonJS 和 AMD 兩種,前者用于服務(wù)器,后者用于瀏覽器,這篇文章給大家介紹了javascript中import和export用法總結(jié),感興趣的朋友一起看看吧2025-05-05
教你如何在 Javascript 文件里使用 .Net MVC Razor 語法
文章主要是介紹了通過一個第三方類庫RazorJS,實(shí)現(xiàn)Javascript 文件里使用 .Net MVC Razor 語法,很巧妙,推薦給大家2014-07-07
每個 JavaScript 工程師都應(yīng)懂的33個概念
這個項(xiàng)目是為了幫助開發(fā)者掌握 JavaScript 概念而創(chuàng)立的,它不是必備,但在未來學(xué)習(xí)( JavaScript )中,可以作為一篇指南,需要的朋友可以參考下2018-10-10
scrapyd schedule.json setting 傳入多個值問題
這篇文章主要介紹了scrapyd schedule.json setting 傳入多個值,本文給出了問題分析及思路解決方案,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-08-08
原生JS實(shí)現(xiàn)圖片無縫滾動方法(附帶封裝的運(yùn)動框架)
下面小編就為大家?guī)硪黄鶭S實(shí)現(xiàn)圖片無縫滾動方法(附帶封裝的運(yùn)動框架)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
echarts實(shí)現(xiàn)詞云自定義形狀的示例代碼
這篇文章主要介紹了echarts實(shí)現(xiàn)詞云自定義形狀的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
基于JavaScript實(shí)現(xiàn)的快速排序算法分析
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)的快速排序算法,分析了快速排序的原理并結(jié)合實(shí)例形式給出了javascript快速排序的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04

