값은 다양한 방법으로 생성할 수 있다.
여기서 말하는 다양한 방법이란 표현식을 말한다. 프로그래밍 언어에서 표현식은 중요한 역할을 한다.
표현식은 리터럴, 식별자, 연산자, 함수 호출 등의 조합.
Literal
리터럴 : 소스코드 안에서 직접 만들어 낸 상수 값 자체, 값을 구성하는 최소 단위
Identifier
식별자 : 자바스크립트에서 이름을 붙일 때 사용하는 단어
표현식은 평가(Evaluation.표현식을 실행하여 하나의 값을 만드는 과정)되어 하나의 값을 만든다. 즉, 표현식은 하나의 값으로 평가될 수 있는 문이다
표현식은 평가되어 값을 만들지만 그 이상의 행위를 할 수 없다.
표현식의 역할은 값을 생성하는 것이다.
let
, const
, function
, class
와 같은 선언 키워를 사용하여 변수나 함수를 생성하기도 하고 if
, while
, for
문과 같은 제어문을 생성하여 프로그램의 흐름을 제어하기도 한다./// 예제
let a = 2 * 10; // 표현식 a = 2 * 10을 포함하는 선언문
a = 999; // 표현식이지만 할당문이기도 하다.
let sta = let a = 2 * 10;
let sta = a = 999;
NaN
을 반환한다.이항 산술 연산자 | 의미 |
---|---|
+ | 덧셋 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 |
** | 제곱 |
5 + 2 // 7
5 - 2 // 3
5 * 2 // 10
5 / 2 // 2.5
5 % 2 // 1
5 ** 2 // 25 5의 2제곱
단항 산술 연산자 | 의미 |
---|---|
++ | 증가 |
-- | 감소 |
+ | 효과가 없음 |
- | 양수를 음수로, 음수를 양수로 반전한 값을 반환 |
let a = 5;
let result;
// 선대입 후증가
result = a++;
console.log(result, a); // 5, 6
// 선증가 후대입
result = ++a;
console.log(result, a); // 7, 7
// 선대입 후감소
result = a--;
console.log(result, a); // 7, 6
// 선감소 후대입
result = --a;
console.log(result, a); // 5, 5
+
연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다. 그 외의 경우에는 덧셈 연산자로 동작한다.// 문자열 연결 연산자
'Hello' + 'World' // 'HelloWorld'
'1' + '2' // '12'
'1' + 100 // '1100' (문자열'1'과 숫자열100을 더할경우 문자열 '1100')
// 산술 연산자
1 + true // 2 (true가 타입이 자동으로 숫자로 변경됨, true→1)
false + true // 1 (false→0, true→1)
1 + null // 1 (null→0)
1 + undefined // NaN (undefined→NaN)
할당 연산자 | 사례 | 동일표현 |
---|---|---|
= | x = y | x = y |
+= | x += y | x = x + y |
-= | x -= y | x = x - y |
*= | x *= y | x = x * y |
/= | x /= y | x = x / y |
%= | x %= y | x = x % y |
**= | x **= y | x = x ** y |
let a;
a = 4; // 4
a += 2; // 6
a -= 2; // 4
a *= 2; // 8
a /= 2; // 4
a **= 2; // 16
a /+ 2; // 8
let a;
console.log(a = 100); // 100
let a, b;
b = a = 100; // 연쇄 할당(Chained assignment)
console.log(x, y); // 100, 100
비교 연산자 | 의미 | 사례 | 설명 |
---|---|---|---|
== | 동등 비교 | x == y | x와 y의 값이 같음 |
=== | 일치 비교 | x === y | x와 y의 값과 타입이 같음 |
!= | 부등 비교 | x != y | x와 y의 값이 다름 |
!== | 불일치 비교 | x !== y | x와 y의 값과 타입이 다름 |
true
를 반환한다.5 == 5 // true
5 == '5' // true
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
true
를 반환한다.5 === 5 // true
5 === '5' // false
null === undefined // false
NaN
비교 주의NaN === NaN; // false (NaN은 자신과 일치하지 않는 유일한 값)
0
비교 주의0 === -0 // true
대소 관계 비교 연산자 | 예제 | 설명 |
---|---|---|
> | x > y | x가 y보다 크다 |
< | x < y | x가 y보다 작다 |
>= | x >= y | x가 y보다 크거나 같다 |
>= | x >= y | x가 y보다 작거나 같다 |
'2' > 1 // true(2 > 1)
1 == '01' // true(1 == 1)
// 삼항 조건 연산자의 표현식
조건식 ? 조건식이 true일때 반환할 값 : 조건식이 false일때 반환할 값
?
앞의 첫번째 피연산자가 조건식, 불리언 타입의 값으로 평가될 표현식.true
이면 콜론 :
앞의 값이, false
이면 콜론 :
뒤의 값이 반환된다.let a = 2;
// a가 짝수이면 '짝수', 홀수이면 '홀수'를 반환한다.
// a % 2 = 0 이므로 0은 false로 암묵적 타입 변환
let result = a % 2 ? '짝수' : '홀수';
console.log(result); // '짝수'
!
연산자는 언제나 불리언 값을 반환한다. 하지만 논리합 ||
연산자와 논리곱&&
연산자는 일반적으로 불리언 값을 반환하지만 반디시 불리언 값을 반환해야 하는것은 아니다.논리 연산자 | 의미 |
---|---|
|| | 논리합(OR) |
&& | 논리곱(AND) |
! | 부정(NOT) |
// 논리합(||, OR) 연산자 - 하나라도 true인 경우 true
true || true // true
true || false // true
false || true // true
false || false // false
// 논리곱(&&, AND) 연산자 - 모두 true이여야 true
true && true // true
true && false // false
false && true // false
false && false // false
// 논리 부정(!, NOT) 연산자
!true // false
!false // true
!0 // true (피연산자가 불리언 값이 아닌 경우 암묵적 타입 변환)
if
문에서 자주 사용된다. 주어진 조건 중 하나라도 true
인지 확인하기 위해서let hour = 12;
let isWeekend = true;
if (hour < 10 || hour > 18 || isWeekend) {
console.log('Close'); // 'Close'
} else {
console.log('Open'); // 실행되지 않음
}
let result = value1 || value2 || value3;
true
이면 연산을 멈추고false
로 평가되는 경우)에는 마지막 피연산자를 반환.let a = undefined || null || 0;
console.log(a); // 0 (모두 false이므로 마지막 값을 반환)
// 단락 평가
true || alert('true'); // 왼쪽 조건이 true이므로 alert이 실행되지 않음
false || alert('false');
let result = value1 && value2 && value3;
false
이면 연산을 멈추고true
로 평가되는 경우)에는 마지막 피연산자를 반환.,
쉼표 연산자는 왼쪽 피연산자부터 차례대로 피연산자를 평가하고 마지막 피연산자의 평가가 끝나면 마지막 피연산자의 평가 결과를 반환한다.let a = (1 + 2, 3 + 4);
console.log(a); // 7
()
그룹 연산자는 그룹 내의 표현식을 최우선으로 평가한다.10 * 2 + 3 // 23
10 * (2 + 3) // 50
typeof
연산자는 자신의 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환한다.typeof '' // "string"
typeof 1 // "number"
typeof NaN // "number"
typeof true // "boolean"
typeof undefined // "undefined"
typeof Symbol() // "symbol"
typeof null // "object"
typeof [] // "object"
typeof {} // "object"
typeof new Date() // "object"
typeof /test/gi // "object"
typeof function () {} // "function"
null
의 경우 object
를 반환 하는데 이는 자바스크립트 첫번째 버전에서 설계된 것을 현재 버전에 반영하지 못하고 있기 때문이다. (참고 : The history of “typeof null”)nullish 병합 연산자(nullish coalescing operator) ??
를 사용하면 짧은 문법으로 여러 피연산자 중 그 값이 확정되어있는 변수를 찾을 수 있다.
a ?? b
의 평과 결과는 다음과 같다.a
가 null
도 아니고 undefined
도 아니면 a
b
let fisrtName = null;
let lastName = null;
let nickName = 'Sonny'
console.log(fisrtName ?? lastName ?? nickName ?? "익명"); // Sonny
??
과 ||
의 차이점위의 예제에서 ??
를 ||
로 바꿔도 결과는 동일하다.
하지만 차이점이 있는데,
||
는 첫번째 truthy 값을 반환??
는 첫번째 '정의된 값(defined)'을 반환null
, undefined
, 숫자 0
을 구분 지어야할 때 중요한 역할을 한다.
let height = 0;
console.log(height ?? 100); // 0
console.log(height || 100); // 100
??
사용시 주의사항??
는 연산자 우선 순위가 낮기 때문에 사용 시 괄호를 추가하는게 좋다
let height = null;
let width = null;
let box = (height ?? 100) * (width ?? 50);
console.log(box) // 5000
괄호를 사용하지 않을 경우
let box = height ?? (100 * width) ?? 50;
위의 예제처럼 작동한다.
또한 ??
는 안정성 이유 때문에 ||
, &&
와 함께 사용하지 못한다.
제약을 피하기 위해선 괄호를 사용한다.
참고 문헌
PoiemaWeb: 웹 프로그래밍 튜토리얼 https://poiemaweb.com
모던 JavaScript 튜토리얼 https://ko.javascript.info
벨로퍼트와 함께하는 모던 자바스크립트 https://learnjs.vlpt.us
MDN https://developer.mozilla.org/ko/