이해를 위해 언급될 단어의 의미를 미리 짚고 넘어가자.
- 리터럴(literal) : 사람이 이해할 수 있는 문자 또는 기호를 사용해 값을 생성하는 표기법(notation)
- 문(statement) : 프로그램을 구성하는 최소 실행단위
- 표현식(expression) : 식, 평가될 수 있는 문
- 값 : 표현식(식)이 평가되어 생성된 결과
- 평가 : 식을 해석해서 값을 생성하거나 참조하는 것
값 : (리터럴 등의)표현식이 평가되어 생성된 결과
모든 값은 데이터 타입(number,string...)을 가지며, 메모리에 2진수, 즉 비트의 나열로 저장된다.
ex) 0100 0001 = 65 = A
10+20; // --> 30
10 + 20
의 식이 평가되어 숫자 값 30을 생성한다.
var sum = 10 + 20;
변수 'sum'에 10 + 20이 평가되어 생성된 숫자 값 30이 할당된다.
변수에 할당되는 것이 바로 값이다.
값의 가장 기본적인 생성 방법은 '리터럴'을 사용하는 것이다
리터럴(literal)
: 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법(notation)
사람이 이해할 수 있는 문자인 아라비아 숫자(1,2,3)
/ 알파벳(a,b)
/ 한글(가,나)
또는 미리 약속된 기호인 " "
, .
, []
, {}
, //
등을 표기한 코드를 말한다.
자바스크립트 엔진은 코드가 실행되는 시점인 런타임에 리터럴을 평가해 값을 생성한다.
문(statement)
- 프로그램을 구성하는 최소 실행 단위.
- 문은 여러 토큰으로 구성된다.
- 토큰(token) : 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소
- 문 [var sum = 1 + 2] - 토큰 [var] [sum] [=] [1] [+] [2]
- 컴퓨터에게 내리는 명령으로, 명령문이라고도 부른다.
- 선언문 / 할당문 / 조건문 / 반복문
표현식(expression) : 평가될 수 있는 문(statement)
표현식이 평가되고 나면 새로운 값을 생성하거나 기존 값을 참조한다.
10
'hello'
sum
person.name
arr[1]
10 + 20
sum = 10
sum !== 10
squre()
person.getName
var score = 100;
1)
100
은 리터럴이다. 리터럴100
은 자바스크립트 엔진에 의해 평가되어 값을 생성하므로 리터럴 그 자체로 표현식이다.(리터럴)
**var score = 50 + 50;
2)
50 + 50
이 평가되어 숫자 값100
을 생성하므로 표현식이다.(연산자)score; // -> 이미 선언이 존재한다고 가정
3) 변수 식별자를 참조하면 변수 값으로 평가된다. 값을 생성하지는 않지만 값으로 평가되므로 표현식이다.(선언자)
var x = 1 + 2;
//식별자 표현식 x는 3으로 평가된다.
x + 3; // -> 6
산술 연산자 +
는 좌항과 우항의 값을 연산하는 표현식이므로 양쪽 모두 숫자 값이 위치해야 한다.
그러나 이처럼 x
가 할당되어 있는 숫자 값 3
으로 평가되는 경우,
+
연산자의 좌항에 숫자가 아닌 표현식x
가 위치할 수 있다.
이렇게 '표현식'과 '표현식이 평가된 값'은 동등한 관계, 즉 동치(equivalent)가 되며,
이것은 문법적으로 '값이 위치할 수 있는 자리'에는 표현식도 위치할 수 있다는 것을 의미한다.
'표현식인 문'과 '표현식이 아닌 문'을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다.
// 선언문은 '표현식이 아닌 문'이다.
var x;
var foo = var x; // --> SyntaxError: Unexpected token var
위 코드와 같은 변수 선언문은 값으로 평가될 수 없으므로 표현식이 아니다.
따라서 변수 x
를 값처럼 사용할 수 없다.
그렇다면 다음 코드를 보자.
// 할당문은 그 자체가 표현식이면서 완전한 문이기도 하다. 따라서 할당문은 '표현식인 문'이다.
x = 100;
var foo = x;
console.log(foo) // --> 100
위 코드의 할당문인 x = 100은 그 자체가 표현식이다. 즉, 값처럼 사용할 수 있다.
출처 : 이웅모, 『모던 자바스크립트 deep dive』, 위키북스(2020), p50-58.