[컴] 왜 javascript 에서 object key 의 순서는 보장되지 않는가?

 

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

  1. Does JavaScript guarantee object property order? - Stack Overflow : key 의 순서가 보장된 object 를 원한다면, Map 을 사용하면 된다고 한다.

Reference

  1. Javascript - maintain key order when going from object -> array - Stack Overflow
  2. Property order is predictable in JavaScript objects since ES2015 | Stefan Judis Web Development
  3. Property order is predictable in JavaScript objects since ES2015 : javascript

댓글 없음:

댓글 쓰기