ES6의지도 대 개체, 언제 사용합니까?
런타임까지 키를 알 수없고 모든 키가 동일한 유형이고 모든 값이 동일한 유형 인 경우 객체에 대한 맵을 사용합니다.
개별 요소에서 작동하는 논리가있는 경우 개체를 사용합니다.
질문:
객체 위에지도를 사용하는 적용 가능한 예는 무엇입니까? 특히, "언제 런타임까지 키를 알 수 없습니까?"
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에서 점점 더 잘못되거나 의심스러운 콘텐츠를 찾고 있습니다.
그 문장의 어떤 것도 정확하지 않습니다. 맵을 사용하는 주된 이유는 객체 값 키를 원할 때입니다. 값이 같은 유형이어야한다는 생각은 당연히 그럴 수도 있지만 말도 안됩니다. 런타임까지 키를 알 수 없을 때 객체를 사용해서는 안된다는 생각은 똑같이 터무니 없습니다.
과의 차이점 중 하나는 다음 Map
과 Object
같습니다.
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.
Objects can be evaluated by any IDE:
Object
s are similar to Map
s 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), Object
s have been used as Map
s historically; however, there are important differences that make using a Map
preferable in certain cases:
- The keys of an
Object
areString
s andSymbol
s, whereas they can be any value for aMap
, including functions, objects, and any primitive. - The keys in
Map
are ordered while keys added to object are not. Thus, when iterating over it, aMap
object returns keys in order of insertion. - You can get the size of a
Map
easily with thesize
property, while the number of properties in anObject
must be determined manually. - A
Map
is an iterable and can thus be directly iterated, whereas iterating over anObject
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 usingmap = Object.create(null)
, but this is seldom done. - A
Map
may perform better in scenarios involving frequent addition and removal of key pairs.
참고URL : https://stackoverflow.com/questions/32600157/maps-vs-objects-in-es6-when-to-use
'Nice programing' 카테고리의 다른 글
.NET 용 명령 줄 인수 파서 찾기 (0) | 2020.10.10 |
---|---|
libGDX에서 다른 종횡비를 처리하는 방법은 무엇입니까? (0) | 2020.10.10 |
구분 기호를 제거하지 않고 Python split () (0) | 2020.10.10 |
MailMessage, Sender 및 From 속성의 차이점 (0) | 2020.10.10 |
xib로 재사용 가능한 UIView 만들기 (및 스토리 보드에서로드) (0) | 2020.10.10 |