💁♀️ 연산자(Operator)란,
각각의 연산을 의미하는 기호
- 연산자의 종류. 연산자는 기능에 따라 다양한 종류로 구분 가능
💁♀️ 동등 비교 & 일치 비교란,
- 동등 비교
==
!=
: 암묵적 타입 변환을 통해 타입 일치시킨 후 값은 값인지 비교 (타입이 달라도 같다는 결과 출력)- 일치 비교
===
!==
: 타입과 값이 모두 일치하는지 비교
console.log(`1 == '1' : ${ 1 == '1'}`); // true
console.log(`1 == true : ${ 1 == true}`); // true
console.log(`1 === '1' : ${ 1 === '1'}`); // false
console.log(`1 === true : ${ 1 === true}`); // false
console.log(`0 == '0' : ${ 0 == '0'}`); // true
console.log(`0 == '' : ${ 0 == ''}`); // true
console.log(`0 == false : ${ 0 == false }`); // true
console.log(`0 === '0' : ${ 0 === '0'}`); // false
console.log(`0 === '' : ${ 0 === ''}`); // false
console.log(`0 === false : ${ 0 === false }`); // false
console.log(`null == undefined : ${ null == undefined }`) // true
console.log(`null === undefined : ${ null === undefined }`) // false
NaN은 자신과 일치하지 않는 유일한 값
console.log(`NaN == NaN : ${ NaN == NaN }`); // false
console.log(`NaN === NaN : ${ NaN === NaN }`); // false
// 빌트인 함수 Number.isNaN을 사용해서 확인
console.log(`Number.isNaN(NaN) : ${ Number.isNaN(NaN)}`); // true
유니코드 순으로 비교
// 일치 비교 연산자
console.log(`'hello' === 'hello' : ${ 'hello' === 'hello'}`); // true
console.log(`'hello' !== 'hello' : ${ 'hello' !== 'hello'}`); // false
// 대소 비교 연산자 (알파벳 사전순으로 뒤에 오는 것이 더 큼)
console.log(`'apple' < 'banana' : ${ 'apple' < 'banana'}`); // true
console.log(`'apple' > 'banana' : ${ 'apple' > 'banana'}`); // false
console.log(`'cat' < 'Zoo' : ${ 'cat' < 'Zoo' }`); // false
console.log(`'cat' > 'Zoo' : ${ 'cat' > 'Zoo' }`); // true
💁♀️ 단축 평가란,
표현식을 평가하는 도중 평가 결과가 확정된 경우 나머지 평가 과정을 생략하는 것
- AND(&&)일 때 앞이 F면 뒤를 무시, OR(||)일 때 앞이 T면 뒤를 무시
console.log('apple' && 'banana'); // banana => 'apple'은 truthy한 값이지만 AND연산자 이므로 뒤의 'banana'까지 평가
console.log(false && 'banana'); // false => 이미 하나가 false이므로 뒤 평가 X (단축평가)
console.log('apple' || 'banana'); // apple => 'apple'은 truthy한 값이므로, 이미 T인 결과로 인해 apple 출력 (단축평가)
console.log(false || 'banana'); // banana
var num = 2;
if(num % 2 == 0) {
console.log('짝수');
} else {
console.log('홀수');
}
// 단축 평가 활용
num % 2 == 0 && console.log('짝수');
num % 2 == 0 || console.log('홀수');
var obj = null;
// TypeError: Cannot read properties of null 오류
// var val = obj.value;
>>> obj가 Falsy(null, undefined)값이면 좌항만 실행하며 val -> null
>>> obj가 Truthy 값이면 val -> obj.value
var val = obj && obj.value;
// obj라는 값이 있는지 먼저 판단 후, falsy한 값이면 실행X, truthy한 값이면 value 출력
💁♀️ optional chaining 연산자란,
좌항의 피연산자가 null 또는 undefined인 경우 undefined를 반환하고, 그렇지 않으면 우항의 프로퍼티 참조를 이어감
- optional chaining 연산자 이전에는 논리 연산자 &&를 사용한 단축 평가를 활용했었으나, 빈 문자열과 같은 Falsy값을 false취급해서 생기는 문제 존재
?.
var obj = null;
// var val = obj.value;
var val = obj?.value; // obj가 null 또는 undefined면,
console.log(val); // undefined 반환
var str = '';
var len = str && str.length;
console.log(len); // 아무것도 출력 X (의도와 다름)
// 옵셔널 체이닝을 이용한다면,
var len2 = str?.length;
console.log(len2); // 0을 출력
💁♀️ null 병합 연산자란,
좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자를 반환하고, 그렇지 않으면 좌항의 피연산자를 반환
- 변수에 기본 값을 설정할 때 유용
- null 병합 연산자 이전에는 논리 연산자 ||를 사용한 단축 평가로 변수에 기본 값을 설정할 수 있었으나, 빈 문자열과 같은 Falsy 값을 false로 취급해서 생기는 문제 존재
??
var obj = null;
var test = obj ?? '기본 값'; // '기본 값'은 좌항이 null이나 undefined인 경우 사용할 플랜B
console.log(test);
var val = ''|| '기본 값';
console.log(val); // '기본 값'을 출력 (빈 문자열이 false로 취급되었기 때문)
var val2 = '' ?? '기본 값';
console.log(val2); // 빈 문자열을 출력 (빈 문자열이 false로 취급되지 않고 그대로 출력)