태그 보관물: ecmascript

ecmascript

키가 모두 문자열 일 때 ES6 Map을 사용할 때 요점이 있습니까? 실제로는 이것을 거의 사용하지

일반 객체 키는 문자열이어야하지만, Map어떤 유형의 키도 가질 수 있습니다.

그러나 실제로는 이것을 거의 사용하지 않습니다. 거의 모든 경우에 어쨌든 문자열을 키로 사용합니다. 아마 new Map()보다 느립니다 {}. 그렇다면 Map평범한 물체 대신에 그것을 사용하는 것이 더 좋은 다른 이유가 있습니까?



답변

런타임 데이터 (캐시 등)를 저장하기 위해 Map일반 객체 ( {}) 보다 s를 선호하는 데는 몇 가지 이유가 있습니다 .

  1. .size속성은이지도에 몇 개의 항목이 있는지 알려줍니다.
  2. 다양한 유틸리티 메소드 – .clear(), .forEach()등;
  3. 기본적으로 반복자를 제공합니다!

함수 인수 전달, 구성 저장 등과 같은 다른 모든 경우는 모두 일반 객체를 사용하여 작성됩니다.

또한, 코드를 너무 일찍 최적화하려고하지 마십시오. 프로젝트에 성능 문제가 발생하지 않는 한 일반 객체와 맵의 벤치 마크를 수행하는 데 시간을 낭비하지 마십시오.


답변

확실하지 않지만 성능이지도를 사용하는 이유는 아니라고 생각합니다. 이 업데이트 된 jsperf 페이지를 살펴보십시오.

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

(최소한 문자열을 다룰 때) 객체는 기본 설정 및 가져 오기에 대한 맵보다 훨씬 빠릅니다.


답변

다른 답변은 객체와 Maps의 마지막 차이점을 언급하지 않습니다 .

Map오브젝트는 키 – 값 쌍을 보유하고 있는 키의 원래의 신청서를 기억한다 .

따라서 반복 할 때 Map 객체는 삽입 순서대로 키를 반환합니다.

MDN 에서 인용 , 광산 강조


이것이 Map최근 프로젝트에서 처음으로 사용하기로 결정한 주된 이유였습니다 . <table>각 속성이 특정 행으로 이동 하여에 표시 해야하는 일반 객체가 있습니다.

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

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

Map원하는 키 순서에 따라 객체를 변환하는 함수를 작성했습니다 .

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

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

    return map;
}

그런 다음 맵을 원하는 순서로 반복 할 수 있습니다.

let productMap = objectToMap( product, productPropertyOrder );

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

물론 이것은 Map프로세스에서 생성하지 않고 속성 순서를 반복 할 때 표시 할 수 있기 때문에 약간 고안되었습니다 .

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

그러나 그러한 객체가 배열되어 있고 많은 장소를 표시하려는 경우 먼저 모든 객체를 맵으로 변환하는 것이 좋습니다.


답변