본 게시글에선 기본적인 연산자에 대한 설명은 생략하고 주의하거나 헷갈릴만한 것들에 대해서만 안내하고 있습니다.
연산이 불가능한 경우 NaN를 반환합니다.
단항(unary) 상술 연산자의 경우 피연산자(operand)의 값을 변경하는 부수 효과(side effect)가 있는 경우가 있습니다. 증가(++), 감소(--) 연산자가 이에 해당됩니다. 또한 해당 연산자는 위치에 따라 의미하는 바가 다릅니다.
var x = 0, result;
result = x++; // postfix increment operator (선할당 후증가)
console.log(x, result); // 1 0
result = ++x; // prefix increment operator (선증가 후할당)
console.log(x, result); // 2 2
result = x--; // postfix decrement operator (선할당 후감소)
console.log(x, result); // 2 1
result = --x; // prefix decrement operator (선감소 후할당)
console.log(x, result); // 0 0
+, - 단항 상술 연산자의 경우 숫자 타입이 아닌 피연산자에 사용하면 숫자 타입으로 변환하여 반환합니다.
console.log(-'1'); // -1
console.log(+true); // 1
console.log(-false); // -0
console.log(-'hi'); // NaN
+ 연산자는 피연산자 중 문자열이 하나 이상 존재할 경우 문자열 연결 연산자로 동작합니다. 존재하지 않을 경우 산술 연산자로 동작합니다.
console.log(1 + 23); // 123
console.log('1' + 23); // '123'
console.log(1 + true); // 2
console.log(1 - false); // 1
console.log(1 + null); // 1
console.log(1 + undefined); // NaN
이렇게 개발자의 의도와 상관없이 암묵적으로 타입이 변환되는 현상을 암묵적 타입 변환(implicit coercion)이라고 합니다.
동등 비교(==) 연산자의 경우 암묵적 타입 변환을 통해 타입을 일치시킨 후 값을 비교합니다. 하지만 결과를 예측하기 어렵고 실수하기 쉽기 때문에 최대한 일치 비교(===) 연산자 사용을 지향하는 것이 좋습니다.
아래는 주의할 상황입니다.
// 동등 비교 주의
'0' == ''; // false
0 == ''; // true
false == '0'; // true
false == 0; // true
false == null; // false
null == undefined; // true
// 일치 비교 주의
NaN === NaN; // false (자기 자신과 일치하지 않는 유일한 값)
isNaN(NaN); // true
0 === -0; // true
// Object.js 메서드
Object.is(NaN, NaN); // true
Object.is(-0, +0); // false
(조건식) ? (true일 때 반환값) : (false일 때 반환값)if ... else 문은 값을 반환하는 표현식이 아닌 문이기 때문에 값처럼 사용할 수 없지만 삼항 조건 연산자는 표현식이기 때문에 값으로 평가할 수 있습니다.var result = if (true) { '진실' } else { '거짓' }; // SyntaxError: Unexpected token 'if'
var result = true ? '진실' : '거짓';!0; // true
!''; // true
!1; // false
!'0'; // false0 && ''; // 0
0 || '' ; // ''typeof 연산자는 피연산자의 데이터 타입을 문자열로 반환합니다.
반환되는 문자열은 string, number, boolean, undefined, symbol, object, function 중 하나입니다.
아래는 주의할 상황입니다.
// typeof의 null 반환값은 'object' 입니다.
typeof null; // 'object'
// 선언하지 않은 식별자의 반환값은 'undefined' 입니다.
typeof undeclared; // 'undefined'