모던 자바스크립트 Deep Dive를 읽으면서 가장 기초가 되고, 개념을 확실하게 잡지 않으면 책을 수월하게 읽을 수 없는 섹션이다. 중제목으로 적혀진 기초 개념을 잘 숙지할 수 있도록 학습해보자.
값(value): 식(expression)이 평가(evaluate)되어 생성된 결과를 말한다.
평가(evaluate): 식을 해석해서 값을 생성하거나 참조하는 것을 의미한다.
따라서 변수에 할당되는 것은 값이다.
var sum = 10 + 20 // 연산의 결과로 생성된 숫자 30이라는 값이 평가되어 sum에 할당된다.
리터럴(literral)은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법을 말한다.
문자 그대로가 곧 값이다.
사람이 이해할 수 있는 숫자 리터럴 3을 작성하면 자바스크립트 엔진은 이를 평가해 컴퓨터가 이해할 수 있는 숫자 값 3을 생성한다.
자바스크립트 엔진은 런다임 시점에 리터럴를 평가해 값을 생성한다.
즉, 리터럴은 값을 생성하기 위해 미리 약속한 표기법이다.
리터럴 | 예시 | 비고 |
---|---|---|
정수리터럴 | 100 | |
부동소수점 리터럴 | 10.5 | |
2진수 리터럴 | 0b01000001 | 0b로 시작 |
8진수 리터럴 | 0o101 | ES6에서 도입. 0o로시작 |
16진수 리터럴 | 0x41 | ES6에서 도입. 0x로시작 |
문자열 리터럴 | 'Hello World' | |
불리언 리터럴 | true | |
null 리터럴 | null | |
undefined 리터럴 | undefined | |
객체 리터릴 | { name: 'Park', city: 'Ansan' } | |
배열 리터럴 | [ 1, 2, 3 ] | |
함수 리터럴 | function() {} | |
정규 표현식 리터럴 | /[A-Z]+/gi |
❗️표현식(statement): 값으로 평가될 수 있는 문(statement)
표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
쉽게 말해, 평가를 하면 값이 되는 것이다.
var score = 50 + 50
50 + 50
은 리터럴 연산자로 이뤄져 있다. 50 + 50
을 평가하면 숫자 값 100을 생성한다.
즉, 50 + 50
은 표현식이다.
리터럴 그 자체도 자바스크립트 엔진에 의해 평가되어 값을 생성하므로 리터럴 그 자체도 표현식이다.
이처럼 표현식은 리터럴, 식별자, 연산자, 함수 호출 등의 조합으로 이뤄질 수 있다.
다양한 표현식이 있지만, 값으로 평가 된다는 점, 값을 생성하거나 참조한다는 점에서 모두 동일하다.
❗️값으로 평가 될 수 있는 문은 모두 표현식이다.
문과 표현식을 구별하고 해설 할 수 있어야한다.
문(statement): 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다.
토큰(token): 토큰이란 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 의미한다.
var x; // 변수 선언문 - 값으로 평가 될 수 없다. 즉 표현식이 아니다.
x = 5; // 할당문 - 할당문은 표현식인 문이다
function foo() {} // 함수 선언문 - 함수 리터럴은 표현식이다.
if(x> 1) { console.log(x); } // 조건문
...
Autometic semicolon insertion
자바스크립트 엔진은 ASI를 지원한다.
그러므로 세미콜론을 생략해도 되나. 개발자의 예측과 ASI의 실행 결과가 다를 수 있으므로 세미콜론을 붙이는 것을 권장한다.
표현식은 문의 일부일 수도 있고 그 자체로 문이 될 수도 있다.
var x; // 변수 선언문은 값으로 평가될 수 없으므로 표현식이 아니다.
x = 1+2; // x = 1+2는 표현식이면서 완전한 문이기도 하다.
표현식인 문과 표현식이 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다.
표현식인 문은 값으로 평가되므로 변수에 할당 할 수 있다.
그러나 표현식이 아닌 문은 값으로 평가할 수 없으르모 변수에 할당하면 에러가 발생한다.
할당문은 그 자체가 표현식이지만 완전한 문이기도 하다. 즉, 표현식인 문이다.
var foo = x = 100 console.log(foo) // 100
x는 100으로 평가된다. 따라서 foo변수에는 100이 할당 된다.
완료값: 크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined를 출력한다. 이를 완료 값이라 한다. 완료값은 표현식의 평가 결과가 아니다. 따라서 다른 값고 ㅏ같이 변수에 할당할 수 없고 참조 할 수도 없다.