JavaScript

[JavaScript]두 배열 요소 합쳐서 return 하기 / concat 함수 null 체크

빡새 2022. 11. 21. 08:00


- Cannot read properties of undefined 에러가 나는 경우 -

 

배열 a와 b가 있다.

getTotalMember(a, b) {
    // do somethig
}

배열 a와 배열 b는 둘 다 null일지 아닐지 모른다.
근데 두 배열이 가지는 요소들을 합쳐서 return 해줘야 하는 상황이다.
당장 떠오르는 방법은 배열 a나  b에 concat() 함수를 붙여주는 방법이다.
a.concat(b);
b.concat(a);

그런데 이렇게 하면 null 에러가 뜰지도 모른다.

> Uncaught TypeError: Cannot read properties of undefined (reading 'concat')
왜냐하면 배열 a와 배열 b는 양쪽 모두 null로 넘어올 수 있는 상황이기 때문이다.
a.concat(b); 
위 명령어를 실행한다고 했을 때, b가 null일 때는 상관 없지만, 
a가 null 로 넘어온다고 생각해 보면 이해가 갈 것이다.

그러면 임시로 빈 배열을 하나 만들어 두고, 
그 안에다가 배열 a와 배열 의 요소들을 넣어두면 어떨까?
그리고 그 임시 배열을 반환해준다면 a배열과 b배열의 요소가 모두 담긴 배열을 얻을 수 있을 것이다.
const temp = [];
temp.concat(a, b);
위처럼 하면 temp 를 빈 배열로 확실히 정의했기 때문에 null 에러는 뜨지 않을 것이다.

 

- 요소에 undefined 나 null 이 들어가는 경우 - 


실제로 실행해 보면 null 에러는 뜨지 않지만 또 다른 문제가 발생한다.
a나 b가 null 이어도 concat 함수를 실행하면 그 자체를 요소로 집어넣기 때문이다.
temp 가 빈 배열이고 a 가 null 일 때 concat 함수를 실행하면 그 결과는 아래와 같다.
const temp = [];
const a = null;
const b = ["hello"];
temp.concat(a, b);  // [null, "hello"];
위처럼 null 이나 undefined 가 그대로 요소로 들어가 버린다.

따라서 concat 함수 안에서도 a와 b배열에 nullish check 를 한 번 더 해줘야 한다.
나 가 null 일 경우에는 빈 배열을 이어붙이도록 연산자를 추가했다.
let temp = [];
temp = temp.concat(a || []);
temp = temp.concat(b || []);

이렇게 하면 null pointer exception 도 뜰 일이 없으면서 
null이나 undefined가 배열 요소로 들어가지도 않는다.

getTotalMember(a, b) {
    let temp = [];
    temp = temp.concat(a || []);
    temp = temp.concat(b || []);
    return temp;
}

반응형