<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Map對(duì)象和普通對(duì)象的7個(gè)區(qū)別

          共 2460字,需瀏覽 5分鐘

           ·

          2022-04-03 18:13

          536f4105b412f4e9eb7e5eec565e4074.webp

          來源 | https://levelup.gitconnected.com/7-differences-between-map-objects-and-plain-objects-9690a78fbc06


          在 JavaScript 中,普通對(duì)象和 ES6 的新對(duì)象 Map 都可以存儲(chǔ)鍵值對(duì),但是,它們之間有什么區(qū)別呢?本文將為您一一揭曉。1、初始化與使用普通對(duì)象可以直接使用字面量進(jìn)行初始化,而 Map 需要 Map() 構(gòu)造函數(shù)進(jìn)行初始化,如果想要有初始值,則需要傳遞一個(gè)數(shù)組或其他元素為鍵值對(duì)的可迭代對(duì)象。這些鍵值對(duì)中的每一個(gè)都將被添加到一個(gè)新的 Map 中。
          const obj = {  name: 1,  age: 2,};const map = new Map([  ['name', 1],  ['age', 2],]);

          與普通對(duì)象相比,Map 作為哈希表提供了許多有用的功能。比如判斷一個(gè)key是否在hash表中,在map中可以使用has方法輕松判斷,但是在普通對(duì)象中可能會(huì)增加復(fù)雜度。

          另外,set方法可以為Map設(shè)置key值,get方法可以獲取value,size屬性可以返回當(dāng)前Map中key/value對(duì)的數(shù)量,而plain對(duì)象需要手動(dòng)計(jì)算使用 自己的方法等。詳情見MDN。

          2、?密鑰類型

          普通對(duì)象只接受字符串和符號(hào)作為鍵值,其他類型將被強(qiáng)制轉(zhuǎn)換為字符串類型,而 Map 可以接受任何類型的鍵值(包括函數(shù)、對(duì)象或任何原語)。

          const obj = {};const map = new Map();const key = function () {};obj[key] = 1;map.set(key, 1);// { 'function () {}': 1 }console.log('obj: ', obj);// Map(1) { [Function: key] => 1 }console.log('map: ', map);

          3、Accidental keys

          普通對(duì)象從原型繼承了許多屬性鍵,例如構(gòu)造函數(shù)等。因此,自己的密鑰很可能與原型上的密鑰發(fā)生沖突。但是 Map 默認(rèn)不包含任何鍵,它只包含那些顯式放入的。

          const obj = {};const map = new Map();console.log(obj.constructor); // ? Object() { [native code] }console.log(map.get('constructor')); // undefined

          4、Key order

          雖然現(xiàn)在對(duì)普通對(duì)象的鍵進(jìn)行了排序,但情況并非總是如此,而且排序很復(fù)雜。例如,如果對(duì)象中有鍵需要轉(zhuǎn)換為字符串,則不保留對(duì)象鍵的原始順序。雖然 Map 以簡單的方式排序,但它始終與我們插入的順序相同。

          const obj = {  name: 1,  age: 2,  3: 4,};const map = new Map([  ['name', 1],  ['age', 2],  [3, 4],]);// The original order is not preserved.// {3: 4, name: 1, age: 2}console.log('obj: ', obj);// Map(3) { 'name' => 1, 'age' => 2, 3 => 4 }console.log('map: ', map);

          5、迭代

          我們可以使用 for...of 語句或 Map.prototype.forEach 直接迭代 Map 的屬性,而普通對(duì)象不能直接迭代。

          const obj = {  name: 1,  age: 2,};const map = new Map([  ['name', 1],  ['age', 2],]);for (const [key, value] of map) {  console.log(`${key}: `, value); // name: 1, age: 2}map.forEach((value, key) => {  console.log(`${key}: `, value); // name: 1, age: 2});// Plain objects are not iterable directly.// But we can use functions like `Object.keys` to help us.Object.keys(obj).forEach((key) => {  console.log(`${key}: `, obj[key]); // name: 1, age: 2});

          6、序列化和解析

          普通對(duì)象支持 JSON 序列化,但 Map 默認(rèn)無法獲取正確數(shù)據(jù)。

          const obj = {  name: 1,  age: 2,};const map = new Map([  ['name', 1],  ['age', 2],]);console.log(JSON.stringify(obj)); // "{"name":1,"age":2}"console.log(JSON.stringify(map)); // "{}"

          7、性能

          Map 對(duì)象在涉及頻繁添加和刪除鍵值對(duì)的場景中表現(xiàn)更好,而普通對(duì)象沒有優(yōu)化。

          總結(jié)

          那么普通對(duì)象應(yīng)該被 Map 對(duì)象替換嗎?

          不,如果我們想在 JSON 和原始數(shù)據(jù)之間轉(zhuǎn)換或包含特定的業(yè)務(wù)邏輯,那么我們應(yīng)該使用普通對(duì)象。因?yàn)楫?dāng)我們只想存儲(chǔ)鍵值對(duì)和循環(huán)操作或不斷添加和刪除屬性時(shí),使用 Map 對(duì)象是更好的選擇。

          Map對(duì)象雖然也是繼承自底層的Object.prototype,但它為我們提供了很多實(shí)用的方法來減輕我們的認(rèn)知負(fù)擔(dān),比普通對(duì)象更高級(jí)。



          學(xué)習(xí)更多技能

          請(qǐng)點(diǎn)擊下方公眾號(hào)

          6f14f767db6e9c595dfc06ee7bdb7fca.webp


          d5df74fdb1afc07d520d280f11a2c651.webp

          瀏覽 28
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天艹夜夜艹蜜桃 | 久久韩国 | 韩国精品一二区 | 国产青青 | 女人18毛片AAA片水真多 女人18片毛片90分钟免费 |