js object key order
왜 javascript 에서 object key 의 순서는 보장되지 않는가?
간만에 의문이 들어 찾아봤다. 아래 StackOverflow 답변(ref.1)이면 충분할 듯 하다.
정리를 하면,
- 아직 ECMA-262 에 key 가 보장된다는 이야기가 없다.
- ES6 spec 에 Object.keys 가
ownPropertyKeys
에 의존한다고 정의했다. 그래서 보장된다고 볼 수도 있다. - ref. 3 글을 보면, 여전히 문제는 compatability 인 듯 하다.
from : ES5, https://262.ecma-international.org/5.1/#sec-15.2.3.14
15.2.3.14 Object.keys ( O )
When the keys function is called with argument O, the following steps are taken:
If the Type(O) is not Object, throw a TypeError exception. Let n be the number of own enumerable properties of O Let array be the result of creating a new Object as if by the expression new Array(n) where Array is the standard built-in constructor with that name. Let index be 0. For each own enumerable property of O whose name String is P Call the [[DefineOwnProperty]] internal method of array with arguments ToString(index), the PropertyDescriptor {[[Value]]: P, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, and false. Increment index by 1. Return array.
If an implementation defines a specific order of enumeration for the for-in statement, that same enumeration order must be used in step 5 of this algorithm.
아래처럼 변경됐다.
from : ES6, https://262.ecma-international.org/6.0/#sec-object.keys
19.1.2.14 Object.keys ( O )
When the keys function is called with argument O, the following steps are taken:
Let obj be ToObject(O). ReturnIfAbrupt(obj). Let nameList be EnumerableOwnNames(obj). ReturnIfAbrupt(nameList). Return CreateArrayFromList(nameList).
If an implementation defines a specific order of enumeration for the for-in statement, the same order must be used for the elements of the array returned in step 4.
개인적인 결론
아직까지는 object 의 key 순서는 보장되지 않음을 전제로 프로그래밍을 해야 하지 않을까 싶다.
See Also
- Does JavaScript guarantee object property order? - Stack Overflow : key 의 순서가 보장된 object 를 원한다면, Map 을 사용하면 된다고 한다.
댓글 없음:
댓글 쓰기