Map vs Object
JavaScript의 `Object`와 `Map`은 둘 다 키-값 쌍을 저장하는 자료구조이지만, 몇 가지 중요한 차이점이 있습니다.
### Object
- **키 타입**: 문자열 또는 심볼만 키로 사용할 수 있습니다.
- **순서**: 키의 순서는 삽입 순서를 보장하지 않습니다.
- **성능**: 주로 간단한 구조의 데이터를 저장할 때 사용됩니다.
- **기본 메서드**: `hasOwnProperty`와 같은 기본 메서드를 가지고 있습니다.
### Map
- **키 타입**: 모든 값을 키로 사용할 수 있습니다 (객체 포함).
- **순서**: 삽입된 순서를 보장합니다.
- **성능**: 대량의 데이터 및 빈번한 삽입/삭제에 더 최적화되어 있습니다.
- **메서드**: `size`, `set`, `get`, `delete`, `has` 등 다양한 메서드를 제공합니다.
### 예제
#### Object
```javascript
let obj = {};
obj['key'] = 'value';
console.log(obj['key']); // "value"
```
#### Map
```javascript
let map = new Map();
map.set('key', 'value');
console.log(map.get('key')); // "value"
```
### 요약
- `Object`는 문자열/심볼 키, 삽입 순서 비보장, 간단한 데이터 저장에 적합.
- `Map`은 모든 키 타입, 삽입 순서 보장, 대량 데이터/빈번한 삽입/삭제에 적합.
### `Map` 메서드
1. **`set`**: 키-값 쌍을 추가하거나 업데이트합니다.
```javascript
let map = new Map();
map.set('key1', 'value1');
```
2. **`get`**: 키에 해당하는 값을 반환합니다.
```javascript
let value = map.get('key1'); // 'value1'
```
3. **`delete`**: 특정 키-값 쌍을 제거합니다.
```javascript
map.delete('key1');
```
4. **`has`**: 특정 키가 존재하는지 확인합니다.
```javascript
let hasKey = map.has('key1'); // false
```
5. **`size`**: 맵의 요소 개수를 반환합니다.
```javascript
let size = map.size; // 0
```
6. **`clear`**: 모든 요소를 제거합니다.
```javascript
map.clear();
```
7. **`keys`**: 모든 키를 반환합니다.
```javascript
for (let key of map.keys()) {
console.log(key);
}
```
8. **`values`**: 모든 값을 반환합니다.
```javascript
for (let value of map.values()) {
console.log(value);
}
```
9. **`entries`**: 모든 [키, 값] 쌍을 반환합니다.
```javascript
for (let [key, value] of map.entries()) {
console.log(key, value);
}
```
### `Object` 메서드
1. **프로퍼티 접근 및 설정**: 점 표기법과 대괄호 표기법을 사용합니다.
```javascript
let obj = {};
obj['key1'] = 'value1';
let value = obj.key1; // 'value1'
```
2. **`delete`**: 특정 프로퍼티를 제거합니다.
```javascript
delete obj.key1;
```
3. **`hasOwnProperty`**: 객체가 특정 프로퍼티를 가지고 있는지 확인합니다.
```javascript
let hasKey = obj.hasOwnProperty('key1'); // false
```
4. **`Object.keys`**: 객체의 모든 키를 배열로 반환합니다.
```javascript
let keys = Object.keys(obj); // ['key1']
```
5. **`Object.values`**: 객체의 모든 값을 배열로 반환합니다.
```javascript
let values = Object.values(obj); // ['value1']
```
6. **`Object.entries`**: 객체의 키-값 쌍을 [키, 값] 형태의 배열로 반환합니다.
```javascript
let entries = Object.entries(obj); // [['key1', 'value1']]
```
7. **`Object.assign`**: 하나 이상의 소스 객체로부터 대상 객체로 속성을 복사합니다.
```javascript
let target = { a: 1 };
let source = { b: 2 };
Object.assign(target, source); // { a: 1, b: 2 }
```
8. **`Object.freeze`**: 객체를 동결하여 수정할 수 없게 합니다.
```javascript
let obj = { prop: 42 };
Object.freeze(obj);
obj.prop = 33; // Error in strict mode
```
9. **`Object.seal`**: 객체를 봉인하여 기존 속성을 수정할 수 있지만 새 속성을 추가할 수 없게 합니다.
```javascript
let obj = { prop: 42 };
Object.seal(obj);
obj.prop = 33; // Success
obj.newProp = 24; // Error
```
댓글
댓글 쓰기