Object
순서보장 예시
ES5
까지는 명시적인 order
가 없었다. (순서가 보장되지 않았다는 뜻)
ES2015
부터 특정 상황에 대해 order
순서가 정의되었고, 점진적으로 이 순서가 적용되어 왔고, ES2020
부터는 for…in
에서도 이 순서가 보장된다.
정렬 순서
- 첫번째로
integer-like
요소들이 오름차순 순으로 맨 앞에 정렬된다.
- 두번째로
문자열
요소들이 삽입 순서대로 나열된다.
- 마지막으로
symbol
요소들이 삽입 순서대로 나열된다.
const obj = Object.create(null, {
m: {value: function() {}, enumerable: true}, // string이라서 2순위, 삽입순서대로
"2": {value: "2", enumerable: true}, // integer-like 라서 1순위, 오름차순 적용
b: {value: "b", enumerable: true}, // string이라서 2순위, 삽입순서대로
0: {value: 0, enumerable: true}, // integer-like 라서 1순위, 오름차순 적용
[Symbol('c')]: {value: "sym", enumerable: true}, // symbol이라서 3순위, 삽입순서대로
"1": {value: "1", enumerable: true}, // integer-like 라서 1순위. 오름차순 적용
"a": {value: "a", enumerable: true}, // string이라서 2순위, 삽입순서대로
[Symbol('a')]: {value: "sym", enumerable: true}, // symbol이라서 3순위, 삽입순서대로
[Symbol('b')]: {value: "sym", enumerable: true}, // symbol이라서 3순위, 삽입순서대로
});
console.log(Reflect.ownKeys(obj));
// [LOG]: ["0", "1", "2", "m", "b", "a", Symbol(c), Symbol(a), Symbol(b)]
Map
순서보장 예시
정렬 순서
- Object는 앞서 봤듯이 정렬되는 순서와 로직이 있다.
- 반면에
map
은 무조건 삽입 순서대로 반환됨을 보장한다.
const map1 = new Map();
// 값 삽입 순서 보장
map1.set("a", {});
map1.set("C", {});
map1.set("b", {});
map1.set([Symbol('3')], {});
map1.set(5, {});
map1.set(2, {});
map1.set([Symbol('1')], {});
map1.set("4", {});
map1.set("c", {});
// 삽입된 요소의 값을 변경해도 그대로
map1.get("a")["1"] = 1;
map1.get("a")["2"] = 2;
// 반복문에서 반환 순서 확인
for(const [key, value] of map1.entries()){
console.log("key", key, "value", value);
}
// [LOG]: "key", "a", "value", { "1": 1, "2": 2 }
// [LOG]: "key", "C", "value", {}
// [LOG]: "key", "b", "value", {}
// [LOG]: "key", [Symbol(3)], "value", {}
// [LOG]: "key", 5, "value", {}
// [LOG]: "key", 2, "value", {}
// [LOG]: "key", [Symbol(1)], "value", {}
// [LOG]: "key", "4", "value", {}
// [LOG]: "key", "c", "value", {}