
값value은 식(표현식expression)이 평가evaluate되어 생성된 결과이다.
여기서 평가는 식을 해석해서 값을 생성하거나 참조하는 것이다.
10 + 20;
위 코드에서는 식 10 + 20이 평가되어 숫자 값 30을 생성한다.
이 값들은 어떻게 저장될까? 모든 값은 데이터 타입(int, double, string 등)을 가지며, 메모리에 2진수, 즉 비트bit의 나열로 저장된다.
따라서, 이 비트의 나열은 데이터 타입에 따라 값이 다르게 해석될 수 있다. 예를 들어 0100 0001은 숫자로 65이지만 문자로 해석하면 'A'가 된다.
var score = 10 + 20;
위 코드처럼 변수를 할당할 때, 우변에 식이 들어있다면 식이 먼저 평가되어 값 30을 생성한 후에 변수 score에 값을 할당한다.
리터럴literal은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법notation이다.
간단히 리터럴은 문자(알파벳, 한글, 아라비아 숫자 등) 또는 미리 약속된 기호('', "", [], {}, // 등)로 표기한 코드인 것이다.
이러한 리터럴은 런타임runtime에 평가되고 값이 생성되는 것이다.
리터럴을 통해 아래 표와 같이 다양한 종류의 값을 생성할 수 있다.
| 리터럴 | 예시 |
|---|---|
| 정수 리터럴 | 100 |
| 부동소수점 리터럴 | 10.5 |
| 2진수 리터럴 | 0b01000001 |
| 8진수 리터럴 | 0o101 |
| 16진수 리터럴 | 0x41 |
| 문자열 리터럴 | 'Hello' |
| 불리안 리터럴 | true |
| null 리터럴 | null |
| undefined 리터럴 | undefined |
| 객체 리터럴 | {id: 1, name: 'TAEHWAN'} |
| 배열 리터럴 | [1, 2, 3] |
| 함수 리터럴 | function(){} |
| 정규 표현식 리터럴 | /[A - Z]+/g |
표현식expression은 값으로 평가될 수 있는 문statement이다.
즉, 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
5.2의 리터럴 역시 값으로 평가되기 때문에 표현식이라 할 수 있다.
var score = 10 + 20;
score;
위 코드에서 첫 줄은 값을 생성하고 둘째 줄은 변수 식별자를 참조하므로 모두 표현식이다.
'hello'
30
sum
person.name
10 + 20
sum !== 25
square()
person.getName()
위 코드에서도 모두 형태는 다르지만 값으로 평가될 수 있는 문이므로 모두 표현식이다.
표현식은 값으로 평가되는데, 이 때, 해당 표현식과 그 표현식이 평가된 값은 동차equivalent라 한다.
동차인 경우에는 표현식을 값처럼 사용할 수 있어, 값이 위치하는 자리에 표현식이 위치할 수도 있다.
⚠️ 문과 표현식을 구별할 것!
문statement은 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다.
프로그램: 문의 집합
프로그래밍: 문을 작성하고 순서에 맞게 나열하는 것.
프로그램의 기본 단위인 문은 다시 여러 토큰으로 나눌 수 있다. 토큰token이란 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소이다.
'SyntaxError; Unexpected token ~~~'와 같은 에러문에서 언급하는 토큰이 문의 구성 단위인 토큰이다.
var sum = 10 + 20;
위 코드는 하나의 문이지만, var, sum, =, 1, +, 2, ; 7개의 토큰으로 구성되어 있다.
이처럼 키워드, 식별자, 연산자, 리터럴, 세미콜론 등의 특수 기호는 문법적인 의미를 가지고, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 모두 토큰이라 한다.
문은 명령문이라고도 부른다. 즉, 컴퓨테 내리는 명령인 것이다.
문은 선언문, 할당문, 조건문, 반복문 등으로 구분이 되며,
표현식과 문의 차이점은 표현식이 문의 일부일 수도 있고 그 자체로 문이 될 수도 있다는 점에 있다.
var x;
x = 1 + 2;
위 코드에서 첫째 줄은 변수 선언문으로 값으로 평가될 수 없어 표현식이 아니다.
반면, 둘째 줄은 1, 2, 1 + 2, x = 1 + 2 모두 표현식으로 표현식 자체가 완전한 문이 되기도 한다.
따라서, 문은
표현식인 문: 값으로 평가될 수 있는 문.
ex) 할당문
표현식이 아닌 문: 값으로 평가될 수 없는 문.
ex) 변수 선언문
으로 구분할 수 있다.
문이 값으로 평가되냐 안 되냐로 표현식과 구별할 수 있는 점을 활용하여 변수에 할당해 보는 것으로도 한 번 더 구별할 수 있다.
var foo = var x; //SyntaxError: Unexpected token var
위 코드에서 변수 선언문 'var x'은 표현식이 아닌 문이므로, 값으로 평가 될 수 없다.
따라서, 변수 선언문이 값처럼 사용할 수 없다.
var x;
x = 100;
반면 위 코드에서 x = 100은 그 자체가 표현식이므로, 이 할당문은 아래 코드에서처럼 값처럼 사용할 수 있다.
var foo = x = 100;
console.log(foo);
위 코드에서 할당문 x = 100을 값처럼 변수에 할당했고, 이 할당문은 표현식인 문으로 할당한 값으로 평가된다.
즉, x = 100은 x 변수에 할당한 값 100으로 평가되고, foo 변수에는 다시 x 변수를 할당하여 100이 할당된다.
완료 값? 크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 undefined를 출력하는데, 이 값을 완료 값이라 한다.
ex) var foo = 10; => 출력: undefined
ex) 100 + foo; => 출력: 110
표현식은 값으로 평가될 수 있는 명령문으로,
표현식이 평가되면 새로운 값이 생성되거나, 값을 참조하게 된다.
문(또는 명령문)은 프로그램을 구성하는 기본 단위이자, 최소 실행 단위로, 선언문, 할당문, 조건문, 반복문 등이 있다.
표현식인 명령문과 표현식이 아닌 명령문 구분하기!
내용 출처: [위키북스] 모던 자바스크립트 Deep Dive