자바스크립트 비교연산자를 쓰는데 오류가납니다.
조회수 6126회
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]);
+이렇게 로그를찍으니 첫번째줄은 실행되고 두번째줄에 같은 에러가 나네요
왜 이런 에러 가 발생하는거죠?
-
(•́ ✖ •̀)
알 수 없는 사용자
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"]
처럼 접근할 수도 있습니다.
댓글 입력