<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>

          JS短文 | 5分鐘了解 JS Maps 對(duì)象

          共 3349字,需瀏覽 7分鐘

           ·

          2021-02-12 13:04

          作者:Kyle Cook
          ?????? 網(wǎng)站:Web Dev Simplified Blog
          ?????? 字?jǐn)?shù):1975 字 (非直譯)
          ?????? 閱讀:? ?5 分鐘

          一、開(kāi)篇語(yǔ)

          在日常的業(yè)務(wù)開(kāi)發(fā)中,以下的代碼你是否經(jīng)常見(jiàn)或經(jīng)常寫(xiě)呢?

          const?CURRENCY_MAP?=?{
          ??'United?States':?'USD',
          ??'India':?'Rupee'
          }

          const?currency?=?CURRENCY_MAP['India']

          或者

          const?CURRENCIES?=?[
          ??{?name:?'USD',?country:?'United?States'?},
          ??{?name:?'Rupee',?country:?'India'?}
          ]

          const?currency?=?CURRENCIES.find(c?=>?c.country?===?'India').name

          以上代碼確實(shí)沒(méi)有問(wèn)題,我們?cè)跇I(yè)務(wù)中經(jīng)常用,但是需要?jiǎng)?chuàng)建鍵值映射關(guān)系時(shí),objects 對(duì)象 和 arrays 數(shù)組 通常不是最佳選擇,這也是 JS Maps 存在的理由,今天我們就來(lái)簡(jiǎn)單的聊一聊 JS Maps 集合對(duì)象。

          二、Objects 和 Maps 的區(qū)別

          Map 其實(shí)是是 JS 中的 Class 類,允許你將值存儲(chǔ)在特定的鍵上,但是與 Objects 對(duì)象 有一些主要的區(qū)別,這些特質(zhì),主要是讓 Map 在鍵值應(yīng)用上表現(xiàn)的更加出色。

          1、鍵的類型(Key Types)

          對(duì)于 Objects 類型而言,你只能使用字符串作為鍵的類型(ES6 中也可以是 Symbol 類型),但是 Map 則更寬泛的多,你可以使用任何數(shù)據(jù)類型作為鍵,比如你可以使用 object, string, boolean, function 等類型,接下來(lái)我們來(lái)看看下面兩段代碼:

          const?obj?=?{
          ??a:?'b',
          ??1:?2
          }

          console.log(Object.keys(obj))
          //?["a",?"1"]
          const?map?=?new?Map([
          ??['a',?'b'],
          ??[1,?2],
          ??[{?key:?'value'?},?'obj']
          ])

          console.log(map.keys())
          //?["a",?1,?{?key:?"value"?}]

          創(chuàng)建 map 你需要通過(guò)數(shù)組的形式進(jìn)行創(chuàng)建,我們可以通過(guò) map.keys() 方法獲取 map 對(duì)象的鍵,以數(shù)組的形式返回所有的鍵。

          2、順序(Ordering)

          object 對(duì)象 鍵的順序是不可靠的,直到 ES6 才對(duì)其進(jìn)行規(guī)范(自 ECMAScript 2015 規(guī)范以來(lái),對(duì)象確實(shí)保留了字符串和 Symbol 鍵的創(chuàng)建順序;因此,在只有字符串鍵的對(duì)象上進(jìn)行迭代將按插入順序產(chǎn)生鍵),則 Map 對(duì)象 則不同,當(dāng)我們對(duì)其進(jìn)行迭代時(shí),則是按照其插入的鍵值順序返回的,這個(gè)特性很重要。

          3、迭代(Iterating)

          相對(duì)迭代操作,Maps 相對(duì) objects 更加容易,對(duì)象沒(méi)有內(nèi)置的迭代方法,需要借助 Object.entries()方法返回一個(gè)給定對(duì)象自身可枚舉屬性的鍵值對(duì)數(shù)組,Maps 則天生具有迭代性,這意味著你可以使用 forEach 方法作用于 Maps 上進(jìn)行迭代。

          4、長(zhǎng)度(Length)

          獲取 objects 的長(zhǎng)度并不容易,你需要手動(dòng)計(jì)算,并且比較麻煩。但是 Maps 有個(gè) size 屬性,類似 arrays 數(shù)組 的 length 屬性 能夠準(zhǔn)確的獲取 Maps 鍵/值對(duì)的個(gè)數(shù)。

          5、性能(Performance)

          由于 Maps 設(shè)計(jì)的初衷就是為了解決 鍵/值 查找,因此在頻繁的增刪 鍵/值 操作的場(chǎng)景下,Map 的性能會(huì)更好,則 objects 則沒(méi)有在這種頻繁操作 鍵/值 的場(chǎng)景進(jìn)行優(yōu)化。

          三、如何使用 Maps

          通過(guò)上面的介紹,我們已經(jīng)了解了 Maps 和 objects 的區(qū)別,接下來(lái)聊聊如何使用 Maps。

          1、創(chuàng)建 Map(Creating A Map)

          在上面的例子中,你也許看到了我們是如何創(chuàng)建 Map 的,Map 是一個(gè) Class 類,需要進(jìn)行實(shí)例化,如果你只實(shí)例化,不進(jìn)行傳參的話,則是一個(gè)空對(duì)象。如果需要填充內(nèi)容的話,需要往里添加可迭代的對(duì)象值,比如數(shù)組,第一個(gè)是鍵,第二個(gè)是鍵對(duì)應(yīng)的值。

          const?emptyMap?=?new?Map()
          const?map?=?new?Map([
          ??['key',?'value']
          ])

          2、設(shè)置值(Setting Values)

          一旦你創(chuàng)建了 Map,接下來(lái)你很有可能需要往里填充 鍵/值 內(nèi)容,我們可以使用 set 方法,進(jìn)行 鍵/值 設(shè)置,如下段代碼所示:

          const?map?=?new?Map()

          map.set('key',?'value')
          map.set(true,?'boolean')
          //?"key"?=>?"value"
          //?true?=>?"boolean"

          3、獲取值(Getting Values)

          獲取值和設(shè)置值一樣簡(jiǎn)單,我們可以通過(guò) get 方法,并且傳遞一個(gè)你想獲取鍵的參數(shù),就能獲取對(duì)應(yīng)的值。如果鍵不存在,則返回 undefined。

          const?map?=?new?Map()
          map.set('key',?'value')
          map.set(true,?'boolean')

          map.get('key')
          //?"value"
          map.get(true)
          //?"boolean"
          map.get('wrong-key')
          //?undefined

          4、確認(rèn)鍵是否存在(Checking For Values)

          有時(shí)你需要查看 Map 對(duì)應(yīng)的鍵是否存在,你可以使用 has 方法 檢查對(duì)應(yīng)的鍵是否存在。

          const?map?=?new?Map()
          map.set(1,?'number')

          map.has(1)
          //?true
          map.has('1')
          //?false
          map.has('wrong-key')
          //?false

          您可能會(huì)注意到,檢查鍵時(shí),字符串”1“將返回 false。這是因?yàn)?Map 可以存儲(chǔ)任何類型,所以數(shù)字 1 存儲(chǔ)為數(shù)字而不是字符串。

          5、刪除鍵/值(Removing Values)

          增刪改查是我們最常見(jiàn)的業(yè)務(wù)操作,如果你要進(jìn)行刪除操作,同樣對(duì)于 Map 也十分簡(jiǎn)單,我們可以使用 delete 方法傳遞你要?jiǎng)h除的鍵。

          const?map?=?new?Map()
          map.set(1,?'number')
          map.set('a',?'b')

          map.delete(1)
          map.has(1)
          //?false

          6、迭代操作(Iterating Over A Map)

          有很多方法可以迭代遍歷 Map,但是最常見(jiàn)的方法就是通過(guò) forEach 方法 進(jìn)行迭代。類似數(shù)組的 forEach 方法,但是這個(gè)回調(diào)方法里,含有兩個(gè)參數(shù),一個(gè)表示值,一個(gè)表示鍵。

          const?map?=?new?Map()
          map.set(1,?'number')
          map.set('a',?'b')

          map.forEach((value,?key)?=>?{
          ??console.log(`${key}?=>?${value}`)
          })
          //?1?=>?number
          //?a?=>?b

          四、其它有用的方法和屬性

          • 你可以使用 size 屬性 獲取 Map 鍵/值對(duì)的個(gè)數(shù)。
          • 你可以使用 keys() 方法獲取 Map 中所有的鍵,返回一個(gè)可迭代的數(shù)組。
          • 你可以使用 values() 方法獲 Map 中所有的值,返回一個(gè)可迭代的數(shù)組。
          • 你可以使用 entries() 方法獲得包含鍵/值對(duì)的數(shù)組集合。
          • 你可以使用 clear() 方法清空 Map 中所有的鍵/值內(nèi)容。

          五、結(jié)束語(yǔ)

          Maps 是一個(gè)很棒的數(shù)據(jù)類型,當(dāng)我們需要頻繁使用鍵值字典查找操作時(shí),是一個(gè)不錯(cuò)的選擇。今天的內(nèi)容就到這里,感謝你的閱讀。

          瀏覽 14
          點(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>
                  91视频福利网 | 精品人妻一区二区三区日产乱码 | 精品久久久麻豆 | 国产精品久久久久久久久久久久午夜片 | 老熟女亂伦88AV |