js falsey값
movester를 개발하면서 갑자기 의문점이 들었다.
비지니스 로직 과정에서 값의 falsey함을 따지기 위해 ‘!변수’를 써야할까 ‘변수 === false’ 라고 명확하게 해야할까?
오늘은 자바스크립트의 falsey 에 대해 알아보자.
1. falsey 란?
자바스크립트에서 거짓 같은 값(Falsy, falsey)으 불리언 문맥에서 false로 평가되는 값을 말한다.
보통 값의 참/거짓을 판단하기 위해 if (!변수)
와 같이 falsey 를 사용한다. (변수가 falsey 값이면 참)
2. falsey 값의 종류
- false (boolean 에서의 false)
- 0 (숫자 zero)
- -0 (음수 zero)
- 0n (bigint) boolean으로 사용될 경우, 숫자와 같은 규칙을 따른다. 0n은 거짓 같은 값.
- ”” (빈 string)
- null (아무런 값도 없음)
- undefined (원시값)
- NaN (숫자가 아님)
3. 나의 의문
login service
const login = async ({ loginUser }, res) => {
const daoRow = await userDao.login(loginUser.email);
console.log(daoRow)
if (!daoRow) {
const isLoginSuccess = res
.status(statusCode.DB_ERROR)
.json(utils.successFalse(responseMessage.DB_ERROR));
return isLoginSuccess;
}
if (Object.keys(daoRow).length === 0) {
const isLoginSuccess = res
.status(statusCode.BAD_REQUEST)
.json(utils.successFalse(responseMessage.EMAIL_NOT_EXIST));
return isLoginSuccess;
}
login dao
const login = async email => {
try {
const connection = await pool.getConnection(async conn => conn);
try {
const sql = `SELECT user_idx, email, password, name, is_email_verify FROM user WHERE email = '${email}'`;
const [row] = await connection.query(sql);
connection.release();
return row;
} catch (err) {
console.log(`Query Error > ${err}`);
connection.release();
return false;
}
} catch (err) {
console.log(`DB Error > ${err}`);
return false;
}
};
해당 코드는 유저가 로그인을 할 때 거치는 service/dao 부분이다.
service에서 dao를 호출하여 daoRow 값을 얻는데 이 값은 총 3개의 값을 가질 수 있다.
- false (db error)
- [] (select 반환값 없음)
- [ loginUserData ] (select 반환값)
나의 고민은 각각의 경우에 따라 service에서의 비지니스 로직이 달라지는데 이 경우 daoRow값을 비교하는 구문을 !daoRow (falsey 값) 로 해야할까 아니면 daoRow===false로 명확하게 지정해줘야할까 였다.
그런데 또 의문점이 생겼다.
나는 false 와 [] (빈객체) 가 둘다 falsey 값 체크에 걸릴 줄 알았는데 []는 걸리지 않는 것이다.
자. 다시 위에 2번 falsey 값의 종류를 체크하자.
그렇다. [] (빈객체)는 falsey 값에 포함되지 않는다.왜지? 도대체 왜..? 정말 애증의 자바스크립트다.
4. 그래서 결론은?
- 클린 코드, 가독성 좋은 코드를 짜기 위해 falsey 사용을 지향한다
- 만약 판단할 값이 falsey 한 값으로 2개 이상이 나왔다면 falsey 값 판단이 아닌
(변수 === null) (변수 === undefined) 와 같이 명확하게 지정할 것이다.
하지만 위의 login의 경우 빈 객체는 falsey 가 아닌 관계로- daoRow가 false값인지 판단하는 구문은 ! (falsey)
- (빈 객체) 인지는 length === 0으로 하기로 하였다.