본 게시글에선 기본적인 연산자에 대한 설명은 생략하고 주의하거나 헷갈릴만한 것들에 대해서만 안내하고 있습니다.
연산이 불가능한 경우 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'; // false
0 && ''; // 0
0 || '' ; // ''
typeof
연산자는 피연산자의 데이터 타입을 문자열로 반환합니다.
반환되는 문자열은 string
, number
, boolean
, undefined
, symbol
, object
, function
중 하나입니다.
아래는 주의할 상황입니다.
// typeof의 null 반환값은 'object' 입니다.
typeof null; // 'object'
// 선언하지 않은 식별자의 반환값은 'undefined' 입니다.
typeof undeclared; // 'undefined'