Map, Set, Array객체는 keys, values, entries 메소드를 기본적으로 지원한다.
위 객체들은 이터러블한 객체이므로 위 메소드를 지원하는 것이 이상하지 않다.
유의할점은 위 메소드들이 반환하는 객체가 배열이 아니라 이터러블객체라는 것이다.
반환객체는 반복순회를 위한것이므로 구지 배열객체로 반환할 필요는 없을 것이다.
Object.keys, Object.values, Object.entries메소드는 일반객체의 콜렉션을 반환하는데 특이하게 배열타입객체로 반환한다.
왜 이터러블객체로 반환하지 않는 것일까?
자바스크립트가 이터러블객체를 표준화시키기전에 위 메소드들이 배열을 반환하고 있었기때문에 하위호환을 위해 배열을 반환한다.
Object.prototype.keys와 같이 객체메소드로 구현하지 않고 Object.keys 정적메소드로 구현한 이유는 객체에 keys, valus, entries의 메소드를 오버라이딩할 수 있는 유연성을 주기위해 정적메소드로 구현했다.
Object.keys(user) = ["name", "age"]
Object.values(user) = ["John", 30]
Object.entries(user) = [ ["name","John"], ["age",30] ]
entries는 배열에 배열로 반환하기때문에 반복순회시 구조분해할당을 사용할 수 있다.