1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 2460字,需瀏覽 5分鐘

         ·

        2022-04-03 18:13

        536f4105b412f4e9eb7e5eec565e4074.webp

        來(lái)源 | 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ì)算使用 自己的方法等。詳情見(jiàn)MDN。

        2、?密鑰類(lèi)型

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

        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 以簡(jiǎn)單的方式排序,但它始終與我們插入的順序相同。

        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 語(yǔ)句或 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)無(wú)法獲取正確數(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ì)的場(chǎng)景中表現(xiàn)更好,而普通對(duì)象沒(méi)有優(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í)用的方法來(lái)減輕我們的認(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)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            涩涩在线观看视频 | 亚洲自产| 这里只有日逼精品视频 | 中国91视频 | 亚洲中文字幕无码爆乳av | 秋霞黄色一级片 | 国产免费操逼视频 | 欧美性色黄大片手机版 | 三级在线视频播放 | 黄污视频在线播放 |