Truthy와 Falsy
Javascript의 조건식에서는 Boolean 값이 아니어도 True 또는 False로 인식되는 값들이 있다.
Truthy : 참 같은 값
- 빈 배열 [ ]
- 빈 객체 { }
- 0이 아닌 Number ( 42, -42, Bigint, float...)
- Infinity
- 비어 있지 않은 String ("0", "false"...)
Falsy : 거짓 같은 값
- null
- undefined
- NaN
- 0 , -0
- 비어 있는 String ("")
Boolean 값이 아니어도 true, false로 인식되는 Truthy, Falsy 한 값들을 사용해 논리연산자에서 단락회로평가가 발생하는 연산에 대해 알아보자.
단락회로평가(Short Circuit Evaluation)란?
💡
논리연산자 사용 시 피연산자 둘 중 앞의 연산 결과로 인해 뒤 연산까지 진행하지 않아도 전체 논리 연산의 결과를 알 수 있어, 뒤에 위치한 피연산자는 실행하지 않고 종료하게 되는 경우를 의미한다.
예를들어 논리연산자 (&& , || )를 사용하는 경우를 코드로 알아보자
1. && 연산자
true && false // false => 두 번째 피연산자까지 연산
false && true // false => 첫 번째 피연산자까지만 연산 후 종료
두 피연산자가 모두 true가 될 경우에만 true 를 반환하는 && 연산자.
앞에 위치한 피연산자가 false 인 경우 뒤에 위치한 피연산자는 연산할 필요가 없이 false로 결과가 정의된다.
2. || 연산자
false || true // true => 두 번째 피연산자까지 연산 필요
true || false // true => 첫 번째 피연산자까지만 연산
true || true // true => 첫 번째 피연산자까지만 연산
false || false // false => 두 번째 피연산자까지 연산 필요
두 피연산자가 모두 false 인 경우에만 false를 반환하는 || 연산자.
앞에 위치한 피연산자가 true인 경우 뒤에 위치한 피연산자는 연산할 필요가 없이 true로 결과가 정의된다.
함수를 활용해 Truthy, Falsy , 단락회로 평가를 알아보자
const getName = (person) => {
if (!person) {
return "객체가 아님";
}
return person.name;
}
let person;
const name = getName(person); // "객체가 아님"
- person 객체는 undefined로 falsy한 값.
- getName 함수에서 ! + false = true로 인식되어 "객체가 아님" 이란 String을 반환
- name 변수에는 "객체가 아님" 이라는 String이 저장됨
위 코드를 단락 회로 평가를 사용해 단축시킬 수 있다.
1. &&연산자만 사용. Falsy한 객체 argument
const getName = (person) => {
return person && person.name;
}
let person;
const name = getName(person); // undefined
- person 객체는 undefined로 falsy한 값.
- getName 함수에서 && 논리연산자는 truthy한 피연산자 두 개가 와야지 두번째 피연산자까지 연산을 함.
- falsy한 피연산자가 앞에 위치해 있음으로 앞에 위치한 피연산자까지만 연산. person 자체를 return 하게 됨.
- 따라서 name 변수에는 undefined 값이 저장됨.
2. &&연산자와 ||연산자 모두 사용. Falsy한 객체 argument
const getName = (person) => {
const check = person && person.name;
return check || "객체가 아님";
}
let person;
const name = getName(person); // "객체가 아님"
- person 객체 undefined로 falsy한 값.
- getName 함수에서 && 논리 연산자( falsy한 값이 앞에 나오면 뒤까지 연산 X) 를 사용.
- 앞에 위치한 피연산자가 falsy한 person임으로 check변수에 person(undefined) 값 저장.
- retrun에서 || 연산자( truthy한 값이 앞에 위치하지 않으면 두번째 피연산자까지 연산)를 사용.
- falsy한 값 check를 앞에 위치시키고 truthy한 "객체가 아님" String을 return하게 됨.
- 따라서 name 변수에는 "객체가 아님"이 저장됨.
3. &&연산자와 ||연산자 모두 사용. Truthy한 객체 argument
const getName = (person) => {
const check = person && person.name;
return check || "객체가 아님";
}
let person = {name : "oneyenee"};
const name = getName(person); // "oneyenee"
- person 객체 정의되어 truthy한 값.
- check 변수에 모두 truthy한 값임으로 &&연산자의 특성상 두번째 연산까지 진행하여 person.name 값이 저장됨.
- check 변수에 저장된 "oneyenee" String 값이 truthy함으로 || 연산자의 특성상 첫번째 연산까지만 진행하여 "oneyenee" return.
핵심
- && 연산자 사용 시 첫번째 연산자가 falsy 하면 연산 종료. 첫번째 연산자 return.
- || 연산자 사용 시 첫번째 연산자가 truthy 하면 연산 종료. 첫번째 연산자 return.
'Frontend > Javascript' 카테고리의 다른 글
[Javascript] 콜백 지옥 탈출하기 - Promise (1) | 2024.02.15 |
---|---|
[Javascript] 객체와 배열의 구조 분해 할당(Destructuring Assignment) (1) | 2023.10.05 |
[Javascript] 객체(Object)란? 선언법과 추가,삭제,수정 방법 (1) | 2023.10.02 |
[Javascript] 배열(Array)이란? 배열 선언방법 2가지 (0) | 2023.09.26 |
[Javascript] 화살표 함수(Arrow Function) (0) | 2023.09.13 |