기본적으로 객체를 반복 할 수없는 이유는 무엇입니까?
객체 반복과 관련된 질문을 항상 봅니다. 일반적인 해결책은 객체의 속성을 반복하고 그런 방식으로 객체 내의 값에 액세스하는 것입니다. 이것은 너무 흔하게 보여서 왜 객체 자체가 반복 할 수 없는지 궁금합니다.
ES6와 같은 문 for...of
은 기본적으로 객체에 사용하는 것이 좋습니다. 이러한 기능은 다음을 포함하지 않는 특수 "반복 가능한 개체"에만 사용할 수 있기 때문입니다.{}
사용하려는 개체에 대해이 기능을 사용하려면 여러 단계를 거쳐야합니다.
for ... of 문은 반복 가능한 객체를 반복하는 루프를 만듭니다. (Array, Map, Set, arguments 객체 등 포함) .
예를 들어 ES6 생성기 함수 사용 :
var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}
for (let [key, value] of entries(example)) {
console.log(key);
console.log(value);
for (let [key, value] of entries(value)) {
console.log(key);
console.log(value);
}
}
위의 코드는 Firefox ( ES6 지원 ) 에서 코드를 실행할 때 예상되는 순서대로 데이터를 올바르게 기록합니다 .
기본적으로 {}
객체는 반복 할 수 없지만 그 이유는 무엇입니까? 반복 가능한 객체의 잠재적 인 이점보다 단점이 더 클까요? 이것과 관련된 문제는 무엇입니까?
때문에 또한, {}
객체는 "어레이 같은"컬렉션과는 다른 예 : "반복자는 객체" NodeList
, HtmlCollection
그리고 arguments
, 그들은 배열로 변환 할 수 없습니다.
예를 들면 :
var argumentsArray = Array.prototype.slice.call(arguments);
또는 Array 메서드와 함께 사용 :
Array.prototype.forEach.call(nodeList, function (element) {})
.
위의 질문 외에도 {}
, 특히 [Symbol.iterator]
. 이것은 이러한 새로운{}
"반복 가능한 객체"가 for...of
. 또한 객체를 반복 가능하게 만들면 배열로 변환 할 수 있는지 궁금합니다.
아래 코드를 시도했지만 TypeError: can't convert undefined to object
.
var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};
// I want to be able to use "for...of" for the "example" object.
// I also want to be able to convert the "example" object into an Array.
example[Symbol.iterator] = function* (obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
};
for (let [key, value] of example) { console.log(value); } // error
console.log([...example]); // error
Symbol.iterator
속성이있는 모든 것은 반복 가능합니다. 따라서 그 속성을 구현하면됩니다. 객체가 반복 불가능한 이유에 대한 한 가지 가능한 설명은 모든 것이 객체이기 때문에 모든 것이 반복 가능 하다는 것을 의미 할 수 있습니다 (물론 기본 요소 제외). 그러나 함수 또는 정규식 객체를 반복한다는 것은 무엇을 의미합니까?