값은 식(표현식)이 평가되어 생성된 결과를 말한다.
평가
식을 해석해서 값을 생성하거나 참조하는 것
모든 값은 데이터 타입을 가지며 메모리에 2진수값으로 저장된다.
저장된 2진수 값은 데이터 타입
에 따라 다르게 해석 될 수 있다.
0100 0001
을 숫자로 해석하면 65지만 문자로 해석하면 A다
var sum = 10 + 20;
sum
변수에 저장되는 것은 10 + 20
이라는 표현식이 아니라 10 + 20
의 결과값인 30
이 저장된다.
결국 할당 이전에 표현식이 평가되어 값이 생성되어야 한다.
리터널(literal
)은 문자 그대로 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법(notation
)을 말한다.
3
3은 단순한 아라비아 숫자가 아니라 숫자 리터럴이다.
사람이 이해할 수 있는 리터럴인 3을 코드에 기술하면 자바스크립트 엔진은 이를 평가해 숫자 값 3을 생성한다.
-정수 리터럴
-부동소수점 리터럴
-2진수 리터럴 , 8진수 리터럴, 16진수 리터럴
-문자열 리터럴
-불리언 리터럴
-null 리터럴
-undefined 리터럴
-객체 리터럴
-배열 리터럴
-함수 리터럴
-정규 표현식 리터럴
표현식은 값으로 평가 될 수 있는 문(statement
) 이다.
즉 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
// 리터럴 표현식
10
'Hello'
// 식별자 표현식
sum
person
arr[1]
// 연산자 표현식
10 + 10
sum = 10
sum != 10
// 함수/메소드 호출 표현식
square()
person.getName()
리터럴 또한 값으로 평가되기 때문에 리터럴도 표현식이다.
표현식은 값으로 평가되기 때문에 표현식과 표현식이 평가된 값은 동치
이다.
따라서 표현식은 값처럼 사용 할 수도 있다.
var x = 1 + 2;
x + 3;
x+3
은 표현식이며 +
라는 연산자와 x , 3
이라는 피연산자가 존재한다.
피연산자에는 값
이 존재해야 하는데 x
는 1+3
이라는 표현식이자, 값이다.
문(statement
)은 프로그램을 구성하는 기본 단위이자 최소 실행 단위이다.
이런 문이 모여 만들어진 것이 프로그램이며, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍이다.
문은 여러 토큰으로 구성된다. 토큰은 문법적인 의미를 가지며, 문법적으로 더 이상 나눌 수 없는 코드의 기본 요소를 의미한다.
문은 명령문이라고도 불리며, 컴퓨터에 내리는 명령이다.
선언문
, 할당문
, 조건문
, 반복문
등 등 ..
세미클론은 문의 종료를 나타낸다.
따라서 문이 끝낼 때에는 세미클론을 붙여야 한다.
단 0개 이상의 문을 중괄호로 묶은 코드 블럭 {}
뒤에는 세미클론을 붙이지 않는다.
다만 자바스크립트는 세미클론을 자동으로 붙여주는 세미클론 자동 삽입 기능이 암묵적으로 수행된다.
정리해보자
표현식인 문
: 값으로 평가 될 수 있는 문
표현식이 아닌 문
: 값으로 평가 될 수 없는 문
값으로 평가 될 수 있다는 것에 대한 의미는 값
으로서 의미를 갖느냐는 의미다.
var x;
x 라는 변수를 선언하는 것은 선언문
이다.
하지만 선언문에는 값이 없다.
그냥 선언한거다.
var x + 2
는 실행되지 않는다.
그 이유는 var x
라는 문은 값이 존재하지 않기 때문에
그러니 표현식인 문과 표현식이 아닌 문을 구별하는 방법은 하나의 변수처럼 사용 가능한지, 혹은 값으로서 할당이 가능한지를 생각해보면 된다.
var x = 10;
var foo = x + 10;
console.log(foo);
var x
는 선언문이지만 x
는 표현식인 문이다. x
에는 10
이란 값이 들어있으니
이런 경우엔 변수에 표현식인 문을 선언하는 것도 가능하다. 값이니까 !
완료값
크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나
undefined
를 출력한다. 이를 완료값이라고 한다.완료값은 표현식의 평가 결과가 아니다.
표현식인 문을 실행하면 언제나 평가된 값을 반환한다.
자바스크립트의 모든 값은 데이터 타입을 갖는다.
숫자 타입
: 숫자와 정수 실수 구분 없이 하나의 숫자 타입만 존재 (실수)Infinity
, -Infinity
, NaN (산술연산불가)
문자열 타입
: 문자열따옴표로 감싸는 이유는 토큰과 구분하기 위함이ㅏㄷ.
불리언 타입
: 논리적 참과 거짓undefined 타입
: var 키워드로 선언된 변수에 할당되는 암묵적인 값null 타입
: 값이 없다는 것을 의도적으로 명시할 때 사용하는 값심벌타입
: ES6 에서 추가된 7번째 타입객체
함수
배열
몇 가지는 알고있는 내용이니까 처음 보는 부분만 몇 개 살펴보자
undefined
와 null
undefined
는 말 그대로 정의되지 않은 값이다.
undefined
는 변수 선언 때 할당 전까지 남아있는 값으로 일정시간 할당되지 않는다면 제거된다.
만약 내가 메모리 공간에 할당 전까지 비워뒀다가 조건에 따라서 값을 할당하거나 할당하지 않고 싶다면 어떻게 해야 할까
그 때 undefined
로 두기에는 undefined
의 취지에 어긋날 뿐더러 혼란을 줄 수 있다.
그럴 때는 null
을 할당한다.
심볼 타입은 변경 불가능한 원시 타입의 값이다.
즉 , 다른 값과 중복되지 않는 유일무이한 값이다.
심벌 이외의 원시 값은 리터럴을 통해 생성되지만 심벌은 Symbol
함수를 호출해 명시한다.
const obj = {
[Symbol('myHiddenKey')]: 'I am hidden!',
regularKey: 'I am not hidden!',
};
console.log(Object.keys(obj)); // 출력: ['regularKey']
console.log(obj.regularKey); // 출력: I am not hidden!
console.log(obj[Symbol('myHiddenKey')]); // 출력: undefined
심볼 타입은 주로 객체 속성의 키로 사용되어 충돌을 방지하거나 특별한 용도로 활용된다.
추후 알아보겠지만 자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체이다.
var x = 100;
다음처럼 x
라는 식별자에 100이라는 숫자 타입의 값을 선언했다고 해보자
그러면 자바스크립트 엔진은 숫자 타입인 100을 이진수 형태로 변경하여 메모리 셀에 값을 저장하고 x 식별자에 저장된 메모리들의 주소를 맵핑 할 것이다.
이 때 숫자 100
과 문자 100
의 이진수는 다르기 때문에 우선 데이터 타입에 따라서 메모리 셀에 저장된 주소의 범위가 다를 것이다.
이는 데이터 타입에 따라 메모리 셀에 마련해야 할 공간의 크기와 주소가 결정된다는 것이다.
자바스크립트의 모든 값은 데이터 타입을 갖는다.
C나 자바 같은 정적 타입 언어는 변수를 선언 할 때 변수에 할당 할 수 있는 값의 종류, 데이터 타입을 사전에 선언해야 한다.
이를 명시적 타입 선언이라고 한다.
정적 타입 언어는 변수의 타입을 변경 할 수 없으며 변수에 선언한 타입에 맞는 값만 할당 할 수 있다.
이런 정적 타입 언어는 컴파일 시 타입 체크를 수행하여 변수에 할당 가능한 데이터 타입과 할당 하고자 하는 타입이 동일한지 검사한다.
이를 통해 타입의 일관성을 강제함으로서 더욱 안정적인 코드의 구현을 할 수 있다.
자바 스크립트는 정적 타입 언어와 변수를 선언 할 때 데이터 타입을 선언하지 않고, 선언문을 사용 할 뿐이다.
즉 어떠한 데이터 타입의 값이라도 자유롭게 할당 할 수 있다.
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. (타입 추론)
이러한 특징을 동적 타이핑이라고 하며 자바스크립트는 동적 타이핑이 되는 동적 타입 언어이다.