Falsy 값 이외의 모든 값은, 모두 true
로 평가될 수 있는 Truthly
값이다.
아래 친구들은 자칫하여 Falsy로 헷갈릴 수 있는데, Truthly값이라는 것을 리마인드 해보자!
isTruthy(true);
isTruthy('0');
isTruthy({});
isTruthy([]);
아래와 같은 방법이 있습니다.
String(1); // -> "1"
String(NaN); // -> "NaN"
String(Infinity); //-> "Infinity"
(1).toString(); //-> "1"
(Infinity).toString(); //-> "Infinity"
1 + ''; -> "1"
Infinity + '' -> "Infinity"
Number('0'); // -> 0
Number('-1'); // -> -1
parseFloat('10.53'); -> 10.53
parseInt('-1'); -> -1
+'0'; // -> 0
+'10.53' // -> 10.53
'0' * 1; -> 0
'10.53' * 1 -> 10.53
논리합 또는 논리곱 연산자 표현식의 평가 결과는 불리언이 아닐 수도 있다. 논리합 또는 논리곱 연산자 표현식은 언제나 피연산자 중 한쪽으로 평가된다.
논리곱 연산자는 두 개의 피연산자가 모두 true로 평가될 때, true를 반환한다.
'Cat' && 'Dog' // -> "Dog"
첫 번째 피연산자 'Cat'은 Truthy값이므로, ture로 평가된다. 이 시점까지는 위 표현식을 평가할 수 없다. 두 번째 피연산자까지 확인을 해 보아야 이것을 평가 가능하다.
두번째 피연산자가 논리곱 연산자의 결과값을 결정하므로, 논리곱 연산자는 논리 연산의 결과를 결정하는 피연산자인 Dog
를 반환한다.
논리합(||) 연산자는 두 개의 피연산자 중 하나만 true로 평가되어도 true를 반환한다. 논리합 연산자도 좌항에서 우항으로 평가가 진행된다.
첫 번째 'Cat' 은 Truthy값이므로 true로 평가된다. 이 시점에 이미, 두 번째 피연산자까지 평가해보지 않아도 위 표현식 결과 반환 가능하니까, 거기서 끝나는것이다. 결과적으로 'Cat'이 반환됩니다.
이렇게 논리곱과 논리합 연산자는 논리 연산의 결과를 결정하는 피연산자를 타입 변환하지 않고 그대로 반환합니다. 이를 단축 평가라고 합니다.
단축 평가는 평가하는 도중에 평가 결과가 확정된 경우, 나머지 평가 과정을 생략합니다.
어떤 조건이 Truthy 값일 때, 무언가를 해야 한다면 논리곱(&&) 연산자 표현식으로 if문을 대체할 수 있다.
var done = true;
var message = ' ';
if (done) message = "완료"
//대신에 아래와 같이 쓸 수 있다!
message = done && "완료"
console.log(message); //완료 출력
var done = false;
var message = ' ';
if(!done) message = "미완료"
message = done || "미완료";
conosole.log(message); //미완료 출력
객체는 키와 값, 그리고 프로퍼티의 집합이다. 만약 객체를 가리키기를 기대한느 변수의 값이 객체가 아니라, null 또는 undefined인 경우 객체의 프로퍼티를 참조하면 타입 에러가 발생한다. 이를 방지하기 위해!
var elem = null;
var value = elem && elem.value; -> null
//elem이 null이나 undefined와 같은 Falsy 값이면 elem으로 평가, Truthy 값이면 elem.value로 평가
원래 아래처럼 쓰면 에러가 납니다.
var elem = null;
var value = elem.value; //TypeError
함수를 호출할 때 인수를 전달하지 않으면 매개변수에는 undefined가 할당됩니다. 에러를 방지하기 위해 작성하는 부분이 중요하겠지요.
function getStringLength(str)
{
str = str || '';
return str.length;
}
getStringLength(); //-> 0 반환
getStringLength('hi') //-> 2 반환
ES11부터 새롭게 도입된 완전 신제품이닷!!
좌항의 피연산자가 null
또는, undefined
인 경우, undefined
를 반환하고, 그렇지 않으면 우항의 프로퍼티
를 참조합니다.
var elem = null;
//elem이 null 또는 undefined면 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조
var value = elem?.vlaue;
console.log(value); //undefined
객체를 가리키기를 원하는데, null
또는 undefined
일 수도 있으니까, 이를 참조하기 전에 확인하면 좋겠쥬.
?.
가 등장하기 이전에는 논리 연산자를 이용하여 확인했습니다! (null 하고 undefined가 falsy 값이니껜~)
논리 연산자 &&
는 좌항 연산자가 false
로 평가되는 Falsy
갑싱 등장하게 되면 좌항을 그대로 반환한다! 좌항 피연산자가 Falsy
값인 0
이나, ''
인 경우에도 마찬가지이다.
그런데 주의할점은 0이나, ''은 객체로 평가될 수 있다. 원시 값과 래퍼 객체에 대해서 알아보자.
?.
은 좌항 연산자가 Falsy 값이라도, null
이나 undefined
가 아니라면, 우항의 프로퍼티 참조를 이어간다.
var str = '';
var length = str?.length;
console.log(length); //0 출력
이 친구도 마찬가지로 신제품이다. ES11부터 합류되었기 때문!
좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환한다.
var foo = null ?? 'default string';
console.log(foo) //"default string"
??
연산자는 변수에 기본값을 할당할 때 매우 유용하다.
이전에는 논리 연산자 ||
를 활용하여, 좌항의 피연산자가 falsy 값을 가지고 있다면 우항의 피연산자를 반환하도록 하였다.
만약 Falsy 값인 0이나 ''도 기본값으로서 유효하게 된다면, 문제가 발생해서 ?? 연산자가 유용하다.