7. Expression vs statement
- reference
자바스크립트의 두 가지 주요 구문
- Expression(식)
- Statement(문)
expression은 statement처럼 작동할 수 있지만 statement는 expression처럼 작동할 수 없기 때문에 두 가지를 구분하는 것은 중요하다.
1 | const x = 5; |
둘 다 value를 리턴하기 때문에 expression이다. (물론 5는 이미 5라는 값이라고 생각할 수 있지만 computer science에서는 5는 5로 값이 resolve 되었다고 본다.)
Expressions
expression은 하나의 값을 생성한다.
- expression은 단일 값을 생성하는 자바스크립트 스니펫(재사용 가능한 소스 코드)이다.
- 원하는 만큼 길게 쓸 수 있지만 결과는 항상 단일 값이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
152 + 2 * 3 / 2
(Math.random() * (100 - 20)) + 20
functionCall()
window.history ? useHistory() : noHistoryFallback()
1+1, 2+2, 3+3
declaredVariable
true && functionCall()
true && declaredVariable
expression이 반드시 상태를 변경할 필요 없다.
1
2
3
4
5
6
7
8
9const assignedVariable = 2; //this is a statement, assignedVariable is state
assignedVariable + 4 // expression
assignedVariable * 10 // expression
assignedVariable - 10 // expression
console.log(assignedVariable) // 2위 스니펫의 모든 expression에도 불구하고
assignedVariable
의 값은 여전히 2이다. 따라서 이 섹션의 제목에서 ‘반드시 변경할 필요가 없다’라고 한 이유는 함수 호출이 expression이지만 함수가 상태를 변경하는 statement를 포함할 수 있기 때문이다.따라서
foo()
라는 함수 자체는 undefined를 리턴하거나 다른 값을 리턴하는 expression인데1
2
3const foo = foo() => {
assignedVariable = 14
}이렇게 쓰게 되면 호출이 expression이지만 호출로 인해 상태가 변경되었다. 따라서 foo함수와 statement를 더 보기 좋게 쓰는 방법은
1
2
3
4const foo = foo() => {
return 14 // 가독성을 위한 명시적 리턴
}
assignedVariable = foo()위에 보다 더 좋은 방법은
1
2
3
4const foo = foo(n) => {
return n
}
assignedVariable = foo(14)이런 방법으로 코드를 더 읽기 쉽게 구성할 수 있고 expression과 statement를 명확하게 구분할 수 있다.
statements
자바스크립트에서는 값이 기대되는 곳에서는 statement를 사용할 수 없다. 따라서 함수의 인자, 연산자의 피연산자, 반환 값 등으로 사용할 수 없다. statement는 단지 액션을 실행하고 제어할 뿐이며 값을 생성하지 않는다.
- 자바스크립트의 statement
- if
- if - else
- while
- do - while
- for
- switch
- for - in
- with (더 이상 사용되지 않는 statement)
- debugger
- variable declaration
밑의 스니펫을 브라우저의 콘솔에 적은 뒤 엔터를 눌러보자
1 | if (true) {9+9} |
18을 리턴하는 것을 볼 수 있는데, 그럼에도 불구하고 expression이나 Javascript가 값을 기대하는 곳에서는 사용할 수 없다. (expression이 기대되는 곳에 statement를 사용할 수 없다.)
1 | let b = if(ture){9+9} // syntax error |
- expressions를 보는 것은 계산 과정을 이해하는 데에 도움이 된다.
1
12 + (square(7+5)) + square(square(2));
- ‘12’ resolves to ‘12’
- ‘7’ resolves to ‘7’
- ‘5’ resolves to ‘5’
- ‘7+5’ resolves to ‘12’
- ‘square 12’ resolves to ‘144’
- ‘12’ + ‘144’ resolves to ‘156’
— 1 차 계산 끝 —
자바스크립트에서는 12 + 144 + square(square(2))의 계산 과정 중이다.
단일 값을 반환 할 때까지 끝나지 않는다.
결국 12 + 144 + 16
이 되고 +
연산자는 왼쪽부터 실행되기 때문에 156+ 16
이 되고 172
라는 단일 값을 얻게 된다.