이것은 배열의 함정입니다. 정의되지 않은 것은 그렇게 정의되지 않은 것이 아닙니다. 자동으로 생성된 슬롯은 "빈 슬롯"이라고 하며 크롬에서는 이를 정의되지 않은 것으로 표시합니다. 실제 undefound가 하나씩 출력되고, 빈 슬롯에는 "undefine × 7"이라는 단어가 출력되는 것도 볼 수 있습니다.
이 문제를 다른 각도에서 생각해 볼 수 있습니다. var a = [1,2,3,4] delete a[0] console.log(a)//[undefine × 1, 2, 3, 4] a.length//4 a.forEach(it=>console.log(it))// 2 3 4 질문으로 돌아가서, forEach가 캡슐화되면 이 "정의되지 않음"은 건너뛰고 다시 작성할 수 있습니다. 이 방법을 사용해보세요. 값이 어떻든 정상적으로 인쇄가 가능합니다
귀하가 정의한 것은 희소 배열(길이가 배열 요소 수보다 큰 배열)이기 때문에
으아악in
를 사용하여 해당 배열 요소가 존재하는지 확인할 수 있습니다.그리고
forEach
은 원래 인덱스가 존재하는 요소만 순회합니다.이것은 배열의 함정입니다. 정의되지 않은 것은 그렇게 정의되지 않은 것이 아닙니다. 자동으로 생성된 슬롯은 "빈 슬롯"이라고 하며 크롬에서는 이를 정의되지 않은 것으로 표시합니다. 실제 undefound가 하나씩 출력되고, 빈 슬롯에는 "undefine × 7"이라는 단어가 출력되는 것도 볼 수 있습니다.
forEach, 지도 등은 빈 슬롯을 건너뜁니다. 솔루션을 참고해주세요
으아악forEach는 이렇게 작성되기 때문에 내장된 forEach는 정의되지 않은 경우에도 계속됩니다.
건너뛰지 않는 버전을 직접 작성할 수 있습니다
이 문제를 다른 각도에서 생각해 볼 수 있습니다.
var a = [1,2,3,4]
delete a[0]
console.log(a)//[undefine × 1, 2, 3, 4]
a.length//4
a.forEach(it=>console.log(it))// 2 3 4
질문으로 돌아가서, forEach가 캡슐화되면 이 "정의되지 않음"은 건너뛰고 다시 작성할 수 있습니다. 이 방법을 사용해보세요. 값이 어떻든 정상적으로 인쇄가 가능합니다