Null, Undefined, 0
자바스크립트에서 변수에 값이 할당되지 않은 것을 표현하는 방법은 2가지입니다.
널(Null) 이라고 부르는 이 원시형 타입은 자바스크립트에서는 변수가 빈값으로 초기화가 된 상태임을 표시합니다.
다른 개발 언어에서는 초기화 조차 되지 않은 상태를 의미기도 하기 때문에 다른 언어에 경험이 있는 경우 혼동할 수 있습니다.
언디파인드(Undefined) 는 변수가 정의되지 않은 것입니다. 선언되지 않았기 때문에 변수 명만 존재하고 아무 것도 할당되지 않은 것을 말합니다.
여기까지 읽어도 사실 아무 것도 할당되지 않은 것과 빈 값으로 초기화를 한 것의 차이가 와닿지 않을 수 있습니다.
자바스크립트는 원시형 데이터 타입도 내부적으로는 객체로 래핑(Wrapping) 을 해서 구현을 합니다.
즉 원시형 변수를 선언했지만, 내부적으로는 객체가 생성된다는 뜻입니다.
널(Null)은 내부적으로 널 객체가 생성되고, 변수는 이 널 객체의 참조 주소를 가지고 있습니다. 널 객체에는 물론 값이 할당되지 않습니다.
언디파인드(Undefined)는 내부 객체가 생성된 것이 없습니다. 따라서 변수는 객체의 참조 주소도 가지고 있지 않습니다.
둘다 실제 값은 없지만, 하나는 내부적으로 사용하는 객체 조차도 생성되지 않은 것입니다.
null/undefined 비교
Null과 Undefined는 값이 할당되지 않은 점에서는 같습니다.
따라서 값을 비교하는 이항 비교 연산자를 사용하면
let a = null; //널 값으로 초기화let b; //변수명만 존재
if(a == b){ console.log('true');}
와 같이 true가 됩니다.
그러나 둘은 다른 원시형 데이터 타입입니다. 데이터 타입까지 비교를 하는 삼등호연산자로 비교시 둘은 분명히 다른 타입입니다.
let bool = a === b ? true : false;console.log(bool);
자바스크립트로 코딩을 할 때 Undefined 상태인 변수는 사용하지 않는 것이 원칙입니다.
코드 상의 오류를 발생시킬 가능성이 높아지고, Undefined 여부를 사전에 추가로 체크해야 하는 번거로움이 생기기 때문입니다.
따라서
let a;
와 같은 식의 초기화가 없는 선언 코드는 사용을 해서는 안됩니다.
특히, 함수의 파라메터를 정의할 때 불필요하게 많은 파라메터를 정의해서 인자로 넘어오는 값이 없는 상태의 파라메터가 생기는 것은 굉장히 좋지 않습니다.
자바스크립트는 정의한 파라메터에 인자값이 넘어오지 않으면 Undefined를 넘기게 됩니다.
당연한 원칙이지만, 이것이 문제가 되는 이유는 정의한 함수의 파라메터 갯수와 실제 넘어오는 인자의 갯수가 달라도 자바스크립트는 에러를 발생시키지 않습니다.
그리고, 실제로 파라메터 변수를 사용하는 시점에서야 Undefined 인 값으로 인해 오류가 발생합니다.
이런 오류 상태를 피하기 위해 Undefined 여부를 사전 체크하는 코드를 추가해야하는 번거로움이 자주 있게 됩니다.
이런 Undefined 로 인한 문제를 피하기 위한 다양한 방어 수단이 ES6에서 도입되었으며, 기본 파라메터, 나머지 파라메터 와 같은 다양한 방법을 활용할 수 있습니다.
true/false
Null, Undefined, 0 은 모두 조건문 비교에서 false 입니다.
변수에 값을 적용하거나 객체를 할당하는 경우, 특히 객체를 할당하는 경우, 변수의 true/false 여부를 체크함으로써 변수나 객체 할당이 이루어졌는지를 체크할 수 있습니다.
변수의 true/false 를 체크하는 코드를 앞단에 추가해주는 코딩 습관을 들여놓으면, 보다 견고하고 튼튼한 코드를 완성하는데 많은 도움이 됩니다.
let json = getAJAX();
if(json){ console.log(obj.name);}