Nice programing

ES6의지도 대 개체, 언제 사용합니까?

nicepro 2020. 10. 10. 10:57
반응형

ES6의지도 대 개체, 언제 사용합니까?


참조 : MDN 맵

런타임까지 키를 알 수없고 모든 키가 동일한 유형이고 모든 값이 동일한 유형 인 경우 객체에 대한 맵을 사용합니다.

개별 요소에서 작동하는 논리가있는 경우 개체를 사용합니다.

질문:

객체 위에지도를 사용하는 적용 가능한 예는 무엇입니까? 특히, "언제 런타임까지 키를 알 수 없습니까?"

var myMap = new Map();

var keyObj = {},
    keyFunc = function () { return 'hey'},
    keyString = "a string";

// setting the values
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

console.log(myMap.get(keyFunc));

객체 위에지도를 사용하는 적용 가능한 예는 무엇입니까?

이미 좋은 예가 하나 있다고 생각합니다. Map객체 (Function 객체 포함)를 키로 사용할 때는 최소한 s 를 사용해야 합니다.

특히, "언제 런타임까지 키를 알 수 없습니까?"

컴파일 타임에 알려지지 않은 경우. 간단히 말해 키-값 컬렉션Map 이 필요할 때 항상를 사용해야합니다 . 컬렉션이 필요하다는 좋은 지표는 컬렉션에서 동적으로 값을 추가 및 제거 할 때, 특히 해당 값을 미리 알지 못하는 경우 (예 : 데이터베이스에서 읽음, 사용자 입력 등)입니다.

반대로 코드를 작성하는 동안 개체의 속성이 얼마나 많은지 알 때 개체를 사용해야합니다 (모양이 정적 인 경우). @Felix가 말했듯이 기록 이 필요할 때 . 필요에 대한 좋은 지표는 필드에 다른 유형이 있고 대괄호 표기법을 사용할 필요가없는 경우 (또는 제한된 속성 이름 집합을 예상 할 때)입니다.


ES2015에서 Map일반 객체를 사용하는 이유는 두 가지 뿐이라고 생각 합니다.

  • 객체 유형의 속성을 전혀 반복하고 싶지 않습니다.
  • 또는 그렇게하지만 속성 순서는 중요하지 않으며 반복 할 때 프로그램을 데이터 수준과 구별 할 수 있습니다.

부동산 주문은 언제 중요하지 않습니까?

  • 단일 값과 명시 적으로 연관되어야하는 일부 기능 만있는 경우 (예 : Promise-미래 값에 대한 프록시-및 then/ catch)
  • "컴파일 타임"에 알려진 정적 속성 집합이있는 구조체 / 레코드와 유사한 데이터 구조가있는 경우 (일반적으로 구조체 / 레코드는 반복 할 수 없음)

다른 모든 경우에는 Map속성 순서를 유지하고 프로그램 ( Map객체에 할당 된 모든 속성 )을 데이터 수준 ( Map자체의 모든 항목)에서 분리하므로 사용을 고려할 수 있습니다 .

의 단점은 Map무엇입니까?

  • 간결한 개체 리터럴 구문이 손실됩니다.
  • JSON.stringyfy에 대한 사용자 지정 대체자가 필요합니다.
  • 어쨌든 정적 데이터 구조에 더 유용합니다.

런타임까지 키를 알 수없고 모든 키가 동일한 유형이고 모든 값이 동일한 유형 인 경우 객체에 대한 맵을 사용합니다.

나는 누군가가 왜 그렇게 명백하게 잘못된 것을 쓰는지 전혀 모른다. 요즘 사람들은 MDN에서 점점 더 잘못되거나 의심스러운 콘텐츠를 찾고 있습니다.

그 문장의 어떤 것도 정확하지 않습니다. 맵을 사용하는 주된 이유는 객체 값 키를 원할 때입니다. 값이 같은 유형이어야한다는 생각은 당연히 그럴 수도 있지만 말도 안됩니다. 런타임까지 키를 알 수 없을 때 객체를 사용해서는 안된다는 생각은 똑같이 터무니 없습니다.


과의 차이점 중 하나는 다음 MapObject같습니다.

Map복잡한 데이터 유형을 키로 사용할 수 있습니다. 이렇게 :

const fn = function() {}
const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]);

m.get(document.body) // 'stackoverflow'
m.get(fn) //'redis'

주의 사항 : 복잡한 데이터 유형의 경우 값을 얻으려면 키와 동일한 참조를 전달해야합니다.

Object, 간단한 데이터 유형 ( number, string) 만 키로 허용합니다.

const a = {};
a[document.body] = 'stackoverflow';

console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}

이 질문은 그러나 그것이 닫힐 때까지 거기에서 내 대답이 있습니다 .

In addition to the other answers, I've found that Maps are more unwieldy and verbose to operate with than objects.

obj[key] += x
// vs.
map.set(map.get(key) + x)

This is important, because shorter code is faster to read, more directly expressive, and better kept in the programmer's head.

Another aspect: because set() returns the map, not the value, it's impossible to chain assignments.

foo = obj[key] = x;  // Does what you expect
foo = map.set(key, x)  // foo !== x; foo === map

Debugging maps is also more painful. Below, you can't actually see what keys are in the map. You'd have to write code to do that.

Good luck evaluating a Map Iterator

Objects can be evaluated by any IDE:

WebStorm evaluating an object


Objects are similar to Maps in that both let you set keys to values, retrieve those values, delete keys, and detect whether something is stored at a key. Because of this (and because there were no built-in alternatives), Objects have been used as Maps historically; however, there are important differences that make using a Map preferable in certain cases:

  • The keys of an Object are Strings and Symbols, whereas they can be any value for a Map, including functions, objects, and any primitive.
  • The keys in Map are ordered while keys added to object are not. Thus, when iterating over it, a Map object returns keys in order of insertion.
  • You can get the size of a Map easily with the size property, while the number of properties in an Object must be determined manually.
  • A Map is an iterable and can thus be directly iterated, whereas iterating over an Object requires obtaining its keys in some fashion and iterating over them.
  • An Object has a prototype, so there are default keys in the map that could collide with your keys if you're not careful. As of ES5 this can be bypassed by using map = Object.create(null), but this is seldom done.
  • A Map may perform better in scenarios involving frequent addition and removal of key pairs.

MDN

참고URL : https://stackoverflow.com/questions/32600157/maps-vs-objects-in-es6-when-to-use

반응형