값 / 평가 / 변수 / 리터럴 / 표현식 / 동치 / 문 / 세미콜론 / ASI / 완료 값
5.1 값
식(표현식)이 평가되어 생성된 결과
평가
식을 해석해서 값을 생성하거나 참조하는 것
10 + 9;
는 식이 평가되어 19라는 값을 생성한다.
데이터 타입
모든 값은 데이터 타입을 가진다.
이는 메모리에 2진수(bit)로 저장된다.
메모리의 값은 같은 값이어도 데이터 타입에 따라 다르게 해석된다.
ex) 0100 0001은 숫자로 해석했을 때 65, 문자로 해석하면 ‘A’가 된다.
변수와 값
변수는 하나의 값 저장을 위해 확보한 메모리 공간 자체 or 그 메모리 공간 식별을 위해 붙인 이름
값은 그런 변수에 할당되는 것
5.2 리터럴
- 값을 생성하는 가장 기본적인 방법
- 사람이 이해할 수 있는 문자 or 약속된 기호를 사용해 값을 생성하는 표기법
- 리터럴을 코드에 기술하면 JS 엔진은 이를 평가해 값을 생성
- JS 엔진은 런타임에 리터럴을 평가해 값을 생성한다.
- ⇒ 리터럴은 값 생성을 위해 미리 약속한 표기법
리터럴의 다양한 종류
다양한 수(정수, 부동소수점, 2진수, 8진수, 16진수) / 문자열 / 불리언 / null / undefined /
객체 / 배열 / 함수 / 정규 표현식
5.3 표현식 (expression)
값으로 평가될 수 있는 문(statement)
표현식이 평가되면 새 값을 생성하거나 기존 값을 참조
리터럴과 표현식
리터럴은 값으로 평가되기에 리터럴도 표현식이다.
var score = 100;
일 때 100은 리터럴이며 이는 JS 엔진으로 평가되어 값을 생성하므로 그 자체로 표현식이라 할 수 있다.
var score = 50 + 50;
처럼 리터럴과 연산자의 조합에서도 해당 식이 평가되어 숫자 값 100을 생성하므로 표현식이다.
score;
로 변수 식별자를 참조하면 변수 값인 100으로 평가 된다. 따라서 식별자 참조는 값을 생성하진 않지만, 값으로 평가되므로 표현식이다.
⇒ 표현식은 리터럴, 식별자, 연산자, 함수 호출 등의 조합으로 구성 가능
다양한 표현식은 모두 값으로 평가되며, 값으로 평가될 수 있는 문은 모두 표현식이라 할 수 있다.
동치
표현식과 표현식이 평가된 값의 관계를 의미 → 둘의 관계는 동등하다.
50 + 50과 100은 동치이며 둘은 같다고 할 수 있다.
표현식은 값처럼 사용 가능하기에 문법적으로 값이 위치할 수 있는 자리에는 표현식도 위치할 수 있다.
var x = 2 + 4;
// 식별자 표현식인 x는 6으로 평가된다.
x + 5; // 11
여기서 x는 할당된 숫자 값인 6으로 평가되기에, 숫자 값이 위치해야 할 자리에 표현식 x의 사용이 가능하다.
⇒ 표현식은 다른 표현식의 일부가 돼 새로운 값을 만들 수 있다.
5.4 문 (Statement)
- 프로그램을 구성하는 기본 단위이자 최소 실행 단위
- 프로그램: 문의 집합
- 프로그래밍: 문을 작성하고 순서에 맞게 나열하는 것
- 명령문이라고도 부르기에 이는 컴퓨터에 내리는 명령이라고 할 수 있다.
- 문이 실행되면 명령이 실행되고 어떤 일이 발생하게 된다.
- 토큰의 집합
토큰
문법적인 의미를 가지며, 문법적으로 더이상 나눌 수 없는 코드의 기본 요소
ex) 식별자, 키워드, 연산자, 리터럴, 세미콜론 등의 특수 기호
문의 구분
문은 선언문, 할당문, 조건문, 반복문 등으로 구분 할 수 있다.
선언문
var x;
: 변수가 선언
function fun1 () {}
: 함수가 선언
할당문
x = 10;
: 변수에 값이 할당
조건문
if (x < 20) { console.log(x); }
:
반복문
for (var i = 0; i < x; i+=1) { console.log(i); }
5.5 세미콜론과 세미콜론 자동 삽입 기능
세미콜론
- 문의 종료를 나타내는 표현
- JS 엔진은 세미콜론을 통해 문의 종료 위치를 파악하여 순차적으로 하나씩 문을 실행한다.
- ⇒ 문이 끝날 땐 세미콜론을 붙여줘야 한다.
- 다만 중괄호로 묶은 코드 블록 뒤에는 세미콜론을 붙이지 않는다. (ex: if문, for문 함수 등)
→ 이러한 코드 블록은 언제든 자체 종결성을 가진다. (문의 종료를 의미)
- 세미콜론은 생략 가능한 옵션이다.
ASI (세미콜론 자동 삽입 기능)
- 자바스크립트 엔진은 소스코드 해석 시 문의 끝이라고 예측되는 지점에 세미콜론을 자동으로 붙여주는 기능이 암묵적 수행된다.
- 하지만 해당 기능 동작과 개발자의 예측이 불일치 하는 경우도 간혹 있기에, 이를 주의하고 코드의 정확성을 위해 세미콜론을 올바르게 나타내는 것도 중요하다.
- 개발자가 ASI의 기능 동작을 올바르게 예측하지 못하면 이 기능을 제대로 활용할 수 없다.
function foo() {
return;
{
}
}
function foo2() {
return {};
}
console.log(foo()); // undefined
console.log(foo2()); // {}
위의 예제에서 foo 함수는 ASI의 동작 결과 return; {};
이 되기에 콘솔 출력 시 undefined가 나타난다.
개발자의 예측은 foo2() 처럼 동작하길 원한 것과 다르게 말이다.
세미콜론 지향?
세미콜론에 대한 논쟁이 계속 있지만, 정적 분석 도구인 ESLint와 같은 곳에서 세미콜론 사용을 디폴트로 설정하고 있으며, TC39(ES 기술 위원회)도 세미콜론 사용을 권장하는 분위기라고 한다.
+) 여담이지만 나 또한 명확한 문의 종료를 표현하기 위해서 세미콜론 사용을 지향하고 있다.
5.6 표현식인 문과 표현식이 아닌 문
표현식은 문의 일부일수도, 그 자체로 문이 될 수도 있다.
표현식과 문 구별하기
표현식과 문은 비슷해 구별이 다소 어렵게 느껴지기도 한다.
var x;
→ 변수 선언문은 값으로 평가 불가하니 표현식 X
x = 11 + 3;
→ 할당문은 표현식이면서 완전한 문 (11, 3, 11 + 3도 모두 표현식)
문
- 표현식인 문: 값으로 평가될 수 있는 문
- 표현식이 아닌 문: 값으로 평가 불가한 문
가장 쉬운 구별 법
변수에 할당해보기!
var foo = var x; // 표현식이 아닌 문은 SyntaxError 발생
var x;
x = 100; // 할당문 자체가 표현식! 표현식인 문 -> 값처럼 사용 가능
표현식의 경우 변수에 할당 가능 ← 값으로 평가되기에
반대로, 표현식이 아닌 문은 변수에 할당 불가(에러 발생) ← 값으로 평가 불가하기에
⇒ 표현식인 문은 값처럼 사용 가능하다.
var foo = (x = 113);
console.log(foo); // 113
위의 예시에서 할당문은 표현식인 문으로, 할당한 값으로 평가된다.
따라서 x = 133은 x 변수에 할당한 값 113으로 평가되고, foo 변수에는 113이 할당되게 되는 것이다.
크롬 개발자 도구의 console 창 활용 with 완료 값
개발자 도구의 console 패널에서 표현식이 아닌 문 실행 시 언제나 undefined를 출력한다.
이를 “완료 값”이라 하고, 이는 표현식의 평가 결과가 아니다. ⇒ 다른 값과 같이 변수 할당 / 참조 불가
반대로 표현식인 문을 실행하면 언제나 평가된 값을 반환한다.