자바스크립트 비교연산자를 쓰는데 오류가납니다.


console.log(r[a][b]);

if(r[a-1][b-1] != '-' && r[a-1][b-1] != '+' && r[a-1][b-1] != '*' && r[a-1][b-1] != '#')
    r[a-1][b-1] -= Q;

해당내용으로 실행을 시켜보니

TypeError: Cannot read property '3' of undefined

이런 에러가 발생합니다.

console.log(r[a][b]);
console.log(r[a-1][b-1]);

+이렇게 로그를찍으니 첫번째줄은 실행되고 두번째줄에 같은 에러가 나네요

왜 이런 에러 가 발생하는거죠?

  • 2016년 09월 11일에 작성됨
    학생이고 프로그래밍에 관심이 많아요

  • 위 에러는 배열에 범위를 벗어난 경우에 발생하는 에러입니다. 다시한번 배열을 잘 확인해 보세요.    정대원   2016.9.11 20:41     
  • 아 그렇군요 감사합니다. 이유를 알것같아요    송영빈   2016.9.11 20:44     
  • 출력된 오류를 잘 해석해서 문제를 해결하는 능력도 중요하지요. 전 부족하지만요 ㅋㅋ    PuppyRush   2016.9.12 13:05     
조회수 109


1 답변


답변은 댓글로 해주신 것 같으니 조금 설명해볼까 합니다.

var a = [1, 2, 3];

JavaScript에서는 배열의 범위를 벗어나는 곳을 참조해도 에러가 나지 않습니다. 대신 undefined를 반환하죠. 그래서 a[3]을 참조하면 undefined가 반환됩니다.

a[3]
// => undefined

그런데 참조하는 배열이 이중 배열인 경우,

var b = [ [1, 2, 3], [4, 5, 6] ];

연산 순서대로 생각해보자면 b[2][2](b[2])[2] 로 바꿀 수 있고, 즉 먼저 첫 번째 인덱스 연산자로부터 배열을 반환받은 뒤 다시 참조하는 구조가 됩니다.

b[2]undefined 이므로 위의 식을 바꾸면 (b[2])[2](undefined)[2] 가 됩니다. undefined에서 2번째 인덱스를 찾으려고 하는데 undefined는 배열이 아니죠.

그래서 TypeError: Cannot read property '3' of undefined 같은 에러가 발생합니다. 1차원 배열 인덱싱에서 undefined가 나왔는데 거기서 3번째 인덱스를 찾으려 했기 때문입니다.


Cannot read property 냐면, JavaScript에서 멤버 인덱스를 조회하는 연산은 객체의 멤버를 찾는 연산과 동일한 연산이기 때문입니다. 즉,

a[2]a."2" 는 같습니다. 물론 문법 상으로는 옳지 않아서 두 번째건 문법 오류가 나지만요. 의미상으로는 배열의 인덱스도 객체의 멤버로서 취급합니다.

따라서 거꾸로 객체에서 배열처럼 조회할 수도 있습니다.

var obj = {
    1 : "mem1",
   "2": "mem2",
   "prop" : "mem3"
}

에서, obj["1"], obj[2], obj["prop"] 처럼 접근할 수도 있습니다.


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close