-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
해결됨
filter 영상에서 질문이 있습니다
23.09.29 20:18 작성 조회수 146
0
const selectCategory = (e) => {
if (!myProducts) {
alert('상품 목록을 불러와주세요.');
} else {
const {selectedIndex} = e.target.options; // 구조분해할당 문법
const {value} = e.target.options[selectedIndex];
}
}
여기서 구조분해 할당 문법이 적용이 되었는데 잘 이해가 가지 않아서 질문 드립니다.
1) 구조분해 할당은 배열/객체에서 적용이 가능한 것으로 알고 있는데요, console.log(e.target.options)
를 찍어보면 Array 가 아닌 "HTMLOptionsCollection" 으로 반환이 되는데 어떻게 객체로 되어서 문법이 가능한지 궁금합니다.
=> 보니까.. 첫 Prototype 에만 HTMLOptionsCollection 으로 반환이 되고, Prototype 에서 계속 타고 내려갈수록 결국 "Object" 에서 파생된거라 가능한건가요?
2) option 의 value 값을 어떻게 한 번에 받아올 수가 있는지 궁금합니다.
부가 설명을 드리자면, e.target.options
를 찍으면 많은 정보들(ex. tagName, className, value 등등)이 나오는데요. 원래대로라면 e.target.options[selectedIndex].value
처럼 접근해야 값을 가져올 수 있는건데, 여기서는 const {value} = e.target.options[selectedIndex]
로 한 번에 가져오는게 궁금합니다.
=> 해당 부분을 콘솔로 찍어보았을 때 아래처럼 HTML 태그를 가져오는 건 확인했습니다.<option value="life">생활용품</option>
여기서 구조분해 할당 문법 적용 시 태그에 선언되어 있는 attribute 값이 자동으로 적용 이 되어 가져오는 건지, 아니면 문법적으로 뭔가 고정된 식 이 있는건지 궁금합니다.
아래는 제가 const {value} = e.target.options[selectedIndex];
코드로 적고 콘솔로 찍었을 때 반환하는 값을 테스트 해 본 결과로 공유 드립니다.
<select name="category" class="select">
<option value="life">생활용품</option> <!-- "life" 반환 -->
<option data-id="test">생활용품</option> <!-- "생활용품" 반환 -->
<option data-id="test" value="life">생활용품</option> <!-- "life" 반환 -->
</select>
답변을 작성해보세요.
1
이룸코딩
지식공유자2023.09.30
티라미수님 안녕하세요.
A1
먼저 HTMLCollection
은 유사 배열 객체이고, Iterable입니다.
console.log(typeof e.target.options);
따라서 정확히 배열 객체는 아니나, 배열 객체와 같은 방식으로 접근 (인덱스를 사용해 접근하는 등)하거나 반복할 수 있고, 구조분해할당을 사용할 수 있습니다. 하지만 유사 배열 객체니까 map
같은 건 바로 사용할 수 없습니다.
A2
두 번째 질문은 잘 이해가 가지 않습니다. 우선 올바르게 사용하고 계십니다…! 혹시 구조분해할당을 헷갈리신 것은 아닐까요? ‘한 번에 가져온다’라고 표현하시는 부분에 구조분해할당이 적용되어 있습니다.
console.dir(e.target.options[selectedIndex]);
하나의 옵션 객체를 열어서 그 안에 구조를 보시면, 이 안에 value
가 있고, 현재 그 값을 가져오려고 하고 있습니다. 즉, 객체.value
를 가져오려고 하기 때문에, 이를 구조분해할당하여 바로 가져온 것입니다. (이는 selectedIndex
를 e.target.options
객체에서 가져온 것과 같은 방법입니다.) 같은 방법으로, 만약 동일한 객체의 text
속성도 가져오고 싶다면 다음과 같이 쓸 수 있습니다.
const { value, text } = e.target.options[selectedIndex];
console.log(value, text);
연휴 잘 보내고 계신가요?
답변이 공부하시는 데 도움이 되길 바랍니다.
행복한 연휴 보내세요~
티라미수
질문자2023.09.30
구조분해할당에 대한 의문은 이후에 바로 reduce 강의 듣고 해결 되었습니다 ㅎㅎㅎ
아래처럼 테스트 해보니 하나씩 가져올 수 있다는 걸 인지하게 되었습니다.
const { selectedIndex } = e.target.options;
const { value } = e.target.options[selectedIndex];
const { className } = e.target.options[selectedIndex];
const { dataset } = e.target.options[selectedIndex];
console.log(value, className, dataset);
구조 안의 원하는 속성 값을 바로 가져오고 싶다면 속성명과 동일하게 변수로 선언해서 가져오는 것이 가능하고 => 이 과정을 "구조분해할당" 인 것으로 이해했습니다.
다만 답변처럼 한번에 불러올 수 있는 방법도 있다는 건 처음 알게 되었습니다. ^^
제 스스로가 완전히 이해되기 전이라 질문이 좀 요상했을텐데 자세히 설명해주셔서 감사드리며,
유사배열객체도 이후에 공부해 보겠습니다. 상세한 답변 감사드립니다 !!!
연휴 잘 보내세요! 😊
답변 1