공부공부/JS 딥다이브

[js 딥다이브] 05장 표현식과 문

고생쨩 2023. 10. 16. 12:54
728x90

5.1 값

값(value)은 식(표현식 expression)이 평가(evaluate)되어 생성된 결과를 말함.
평가란 식을 해석해서 값을 생성하거나 참조하는 것을 의미함.

10 + 20; // 30
// 10 + 20은 평가되어 숫자 값 30을 생성함.

모든 값은 데이터 타입을 가지며, 메모리에 2진수(비트의 나열)로 저장된다.
메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있음.
ex) 메모리에 0100 0001을 숫자로 해석하면 65지만 문자로 해석하면 A임.

var sum = 10 + 20;
// sum 변수에는 10 + 20이 평가되어 생성된 숫자 값 30이 할당됨
  • 위 예제의 sum 변수에 할당되는 것은 10 + 20이 아니라 해당식이 평가된 결과인 30임.

  • 즉, 변수 sum이 기억이하는 메모리 공간에 저장된 것은 30임.

  • 따라서 10 + 20은 할당 이전에 평가되어 값을 생성해야 함.

  • 위 예제의 동작 과정
    sum 변수 선언 -> undefined로 초기화 되어 메모리에 할당(호이스팅) -> 10 + 20 평가(런타임) -> sum에 평가값이 30을 할당

5.2 리터럴

리터럴은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법을 말한다.

  • 리터럴은 사람이 이해할 수 있는 문자(아라비아 숫자, 알파벳, 한글 등) 또는 미리 약속된 기호 ('', "", ., [], {}, // 등)로 표기한 코드다.
    즉, 값을 생성하는 모든 코드가 리터럴이다. 라고 생각하면 될듯

  • js엔진은 코드가 실행되는 시점인 런타임에 리터럴을 평가해 값을 생성한다. 즉, 리터럴은 값을 생성하기 위해 미리 약속한 표기법이라고 할 수 있음.

  • 리터럴을 사용하면 다음과 같이 다양한 종류의 값을 생성할 수 있음. 타입과 비슷하나 분류가 좀 다름.

리터럴 예시 비고
정수 리터럴 100
부동소수점 리터럴 10.5
2진수 리터럴 0b01000001 0b로 시작
8진수 리터럴 0o101 ES6에서 도입. 0o로 시작
16진수 리터럴 0x41 ES6에서 도입. 0x로 시작
문자열 리터럴 ‘Hello’
“World”
불리언 리터럴 true
false
null 리터럴 null
undefined 리터럴 undefined
객체 리터럴
배열 리터럴 [ 1, 2, 3 ]
함수 리터럴 function() {}
정규 표현식 리터럴 /[A-Z]+/g

5.3 표현식

표현식은 값으로 평가될 수 있는 문임.
즉, 표현식이 평가되면 새로운 값을 생성하거나 기존값을 참조함.

var score = 100;

위 예제의 100은 리터럴임. 리터럴 100은 js엔진에 의해 평가되어 값을 생성하므로 리터럴은 그 자체로 표현식임.

var score = 50 + 50;

50 + 50은 리터럴과 연산자로 이루어짐. 하지만, 50 + 50도 평가되어 숫자 값 100을 생성하므로 표현식임

score; // -> 100

변수 식별자를 참조하면 변수값으로 평가됨. 식별자 참조는 값을 생성하지는 않지만 값으로 평가되므로 표현식임.

표현식은 리터럴, 식별자(변수, 함수 등의 이름), 연산자, 함수 호출 등의 조합으로 이뤄질 수 있음.
다양한 표현식이 있지만 값으로 평가된다는 점에서 모두 동일.
값으로 평가될 수 있는 문은 모두 표현식임.

5.4 문

  • 문은 프로그램을 구성하는 기본 단위이자 최소 실행 단위임.

  • 문은 여러 토큰으로 구성됨

  • 토큰이란 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 말함.
    ex) 키워드, 식별자, 연산자, 리터럴, 세미콜론, 마침표 등

  • 문을 명령문이라고도 부름.

  • 문은 선언문, 할당문, 조건문, 반복문 등으로 구분할 수 있음.

// 변수 선언문
var x;

// 할당문
x = 5;

// 함수 선언문
function foo() {}

// 조건문
if(x > 1) { console.log(x); }

// 반복문
for(var i = 0;i < 2;i++) { console.log(i); }

5.5 세미콜론과 세미콜론 자동 삽입 기능

  • 세미 콜론은 문의 종료를 나타내고 생략이 가능하다.
  • 하지만 왠만하면 명시적으로 붙이자.

5.6 표현식인 문과 표현식이 아닌 문

  • 표현식은 문의 일부일 수도 있고 그 자체로 문이 될 수도 있다.
var x; // 변수 선언문은 값으로 평가될 수 없으므로 표현식이 아님

x = 1 + 2; // 표현식이면서 완전한 문이기도 함.
  • 표현식인 문과 표현식이 아닌 문을 구별하는 가장 간단하고 명확한 방법은 변수에 할당해 보는 것.
  • 표현식인 문은 값으로 평가되므로 변수에 할당할 수 있음. 하지만 표현식이 아닌 문은 값으로 평가할 수 없으므로 변수에 할당하면 에러가 발생함.

완료값

  • 크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined를 출력하는데 이를 완료값이라 함.
  • 완료값은 표현식의 평가 결과가 아님. 따라서 다른 값과 같이 변수에 할당할 수 없고 참조할 수 없음
var foo = 10; // undefined

if(true) {} // undefined
  • 크롬 개발자 도구에서 표현식인 문을 실행하면 언제나 평가된 값을 반환함.
var num = 10; // undefined

100+num; // 110

num = 100; // 100

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.