Anahtarların tümü dize olduğunda ES6 Haritasını kullanmanın herhangi bir anlamı var mı?


35

Düz nesne tuşları dizge olmalıdır, oysa Mapki herhangi bir tür tuş olabilir.

Fakat pratikte bunun için çok az kullanımım var. Neredeyse tüm durumlarda kendimi zaten dizeleri anahtar olarak kullanırken buluyorum. Ve muhtemelen new Map()daha yavaş {}. Öyleyse Mapdüz bir nesne yerine bunun daha iyi kullanmasının başka bir nedeni var mı?


3
MDN , her zamanki gibi iyi bir kıyaslama yapıyor.
Chris Hayes,

1
Bilginize, Harita ayar ve alma hem de daha hızlı görünüyor .
46’da

@mpen - jsperf şimdi kapalı. Daha map.set('foo', 123)hızlı performans gösterdiğinden emin misin obj.foo = 123? Öyleyse bu çok şaşırtıcı
callum

@callum Uhh..no, pozitif değil. Bazı yeni performans testleri yazmak isteyebilirsiniz.
16’da

Yanıtlar:


42

Çalışma zamanı verilerini (önbellekleri, vb.) Depolamak için Maps over düz nesneler ( {}) kullanmayı tercih etmemin bazı nedenleri var :

  1. .sizeMülkiyet beni girişleri bu harita var kaç bilmesini sağlar;
  2. Çeşitli yardımcı yöntemleri - .clear(), .forEach()vb;
  3. Bana varsayılan olarak yineleyiciler sağlarlar!

Fonksiyon argümanlarını iletmek, konfigürasyonları saklamak, vb. Gibi diğer tüm durumlar düz nesneler kullanılarak yazılır.

Ayrıca, unutmayın: Kodunuzu çok erken optimize etmeye çalışmayın. Projeniz performans sorunları yaşamadıkça, haritalara karşı basit nesneleri kıyaslama yaparak Haritalar ile uğraşmayın.


1
Javascript tarafından kullanılan kimlik hashcode işlevi nedir?
Pacerier

1
@Pacerier ===:)
gustavohenke

Haritalar bugünlerde düz nesnelerden çok daha hızlı.
jayarjo

@gustavohenke Bu doğru değil. MapSameValueZero algoritmasını kullanır. developer.mozilla.org/en-US/docs/Web/JavaScript/…
lolmaus - Andrey Mikhaylov

@ lolmaus-AndreyMikhaylov tamam, ama bunu Mapya da bunu kullandığı hakkında bir şey mi söyledim ?
gustavohenke

4

Bundan emin değilim, ancak performansın Haritalar'ı kullanmak için bir neden olmadığını düşünüyorum. Bu güncellenmiş jsperf sayfasına bir göz atın:

http://jsperf.com/es6-map-vs-object-properties/73

Görünüşe göre (en azından dizelerle uğraşırken) nesneler temel ayar ve alma için haritalardan çok daha hızlıdır.


2
Performans testleri böyle yazmıyor.
Qix

6
Yararlı yorumlar böyle yazmaz. Önerecek alternatif bir metodolojiniz varsa, lütfen ayrıntı vermekten çekinmeyin. Özellikle, bu testlerin nasıl yazıldığı ile ilgili yanlış olan nedir? Herhangi bir şekilde geçersiz mi yoksa yararsız mı?
starlogodaniel

9
Microbenchmarks ile test edilen dil semantikleri / yapıları sadece bir değişkene göre değişebilir. Testleriniz birçok yinelemeye göre değişiklik gösterir ve bunlardan birkaçı, sonuç kullanılmadığından iç döngü içeriğini optimize eder. Bazı testler değişkenleri önceden bildirir, diğerleri ise for for döngüsüne inline değişken değişken bildirimi yapar - bu da farklı performans anormallikleri ortaya çıkarabilir.
Qix

1
Ah, kesinlikle haklısın. Savunmamda, sürümüm ondan önceki sürümde bir gelişme oldu, ancak hem ön bildirimi hem de iç döngü içeriğini optimize etmeyi özledim. Taslağımı geliştiren bir meslektaşımla çalışıyordum ve bu sorunları çözdüğümü düşünüyorum: jsperf.com/es6-map-vs-object-properties/88 . Ancak, farklı veri yapıları için farklı döngü stillerine sahip olmanın geçerli olduğunu düşünüyorum; Gerçek kullanımda, insanlar döngü yapısını en iyi performansla seçeceklerdir ve Harita ve Nesne farklı "optimal" döngü yapılarına sahip olacaktır. Neyse, yakaladığın için teşekkürler.
starlogodaniel

Tamam, şimdi anlıyorum - düz nesnelerden daha yavaştılar, ancak son zamanlarda tarayıcılarda yoğun olarak optimize edildiler.
jayarjo

0

Diğer cevaplar nesneler ve nesneler arasındaki son farktan bahsetmiyor Map:

MapNesne anahtarının değer çiftlerini tutan ve şifreler orijinal ekleme talimatı hatırlar .

Bu nedenle, üzerinde yineleme yaparken, bir Map nesnesi, yerleştirme sırasına göre anahtarları döndürür.

MDN'den alıntı , benimkine vurgu


Bu, Mapyeni bir projede ilk defa kullanmaya karar vermemin ana sebebiydi . <table>Her özellik belirli bir satırda olacak şekilde, a'da görüntülemem gereken normal bir nesnem vardı .

let productPropertyOrder = [ "name", "weight", "price", "stocked" ];

let product =
{
    name: "Lasagne",
    weight: "1kg",
    price: 10,
    stocked: true
}

Mapİstenen anahtar sırasına göre nesneyi dönüştürmek için bir işlev yazdım :

function objectToMap( obj, order )
{
    let map = new Map();

    for ( const key of order )
    {
        if ( obj.hasOwnProperty( key ) )
        {
            map.set( key, obj[ key ] );
        }
    }

    return map;
}

Ardından, harita istenen sırada yinelenebilir:

let productMap = objectToMap( product, productPropertyOrder );

for ( const value of productMap.values() )
{
    let cell = document.createElement( "td" );
    cell.innerText = value;
    row.appendChild( cell );
}

Tabii ki bu biraz tartışmalı çünkü bir emir yaratırken münasebet emri tekrarlanırken ortaya çıkabiliyor Map:

for ( const key of productPropertyOrder )
{
    if ( product.hasOwnProperty( key ) )
    {
        let value = product[ key ];
        // create cell
    }
}

Ancak, bu tür nesnelerden oluşan bir diziniz varsa ve onları birçok yerde görüntüleyecekseniz, önce hepsini haritalara dönüştürmek mantıklı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.