자바스크립트의 indexOf() 함수는 배열로 된 원소를 탐색하지 못하나요?
조회수 896회
const arr = [1, 2, [1, 2], 3, 4, 5];
console.log(arr.indexOf([1, 2])); // -1
위 코드를 실행시키면 인자로 주어진 값을 찾지 못했다는 의미의 -1을 반환합니다.
원래 indexOf()는 배열로 된 원소를 찾지 못하는 건가요?
객체로 된 원소({name: "Steve"} 등)도 찾는데 배열로 된 원소는 왜 못 찾는 것인지 이유가 궁금합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
indexOf()
에 관한 질문이 자주 올라오네요. 여기에 적어놓았지만indexOf()
에 찾고 싶은 값의 '겉모양'을 인자로 넘기면 찾지 못합니다. 단순 문자열이든 배열이든 뭐든 참조가 동일한 뭔가를 넘기셔야 해요.원하시는 결과를 얻으려면 아마 이런 처리가 필요할 겁니다.
var myArray = [1, 2] const arr = [5, 4, myArray, 3, 2, 1] console.log(arr.indexOf(myArray)) // 2
아니면 underscore.js 같은 걸 써보세요.
const arr = [5, 4, [1, 2], 3, 2, 1] _.indexOf(arr, [1, 2]); // 2
-
엽토님 답변대로
indexOf()
는 탐색 대상이 object 타입인경우 값을 꺼내서 비교하는게 아니라 단순히 동등한지(= 같은 객체인지) 보기 때문에 질문하신것처럼 값만 같은 배열은 찾을 수 없습니다.[1, 2] == [1, 2]; // 내용물인 값이 같더라도 서로 다른 객체라서 false
따라서 Array.prototype.indexOf의 내용을 재정의하거나 써드파티를 사용하지 않는 이상 불가능합니다.
- 그런데 왜 다른 객체로 판정하는 것인가요? indexOf()에 인자로 전달할 때 새로운 배열로 할당되는 건가요? 알 수 없는 사용자 2018.10.16 11:33
- 고렇습니다. [1, 2]는 new Array(1, 2)의 다른 표현식이니까 new를 두 번 한게 되죠. 편집요청빌런 2018.10.16 12:49
댓글 입력