C나 Java 등에는 변수 타입(종류)이 다양하지만 자바스크립트에는 변수 타입이 없으므로 변수 선언자는 var, let, const가 있다.
ECMAScript 6부터 let, const 선언자가 추가 되었다.
var x;
console.log(x); // -> undefined
변수를 선언하기만 하면 변수 안에는 정의되지 않았음을 뜻하는 undefined
라는 값이 들어간다.
x = 2;
console.log(x); // -> 2
변수를 선언하지 않고 값을 대입하면, 자바스크립트 엔진이 그 변수를 자동으로 전역 변수로 선언한다. 이렇게 사용하는 경우 버그의 원인이 될 수 있으므로 권장하지 않으며, ECMAScript 5부터 추가된 Strict 모드를 사용한다면 위와 같은 상황에서 오류를 발생시킨다.
console.log(x); // -> undefined
var x;
다른 언어와는 달리 프로그램 중간에 변수를 선언하더라도 프로그램 첫머리에 선언된 것처럼 다른 문장 앞에 생성되어 오류가 발생하지 않는다. 이를 변수 선언의 끌어올림(호이스팅, hoisting)이라고 한다.
console.log(x); // -> undefined
var x = 5;
console.log(x); // -> 5
단, 선언과 동시에 대입하는 경우 var x는 끌어올리지만 x = 5는 끌어올리지 않으므로 위와 같은 결과가 나오게 된다.
C나 Java 등의 프로그래밍 언어에서는 변수의 타입과 일치하는 데이터만 저장할 수 있다. 이처럼 변수에 타입이 있는 언어를 정적 타입 언어라 한다.
var pi = 3.14;
console.log(pi); // -> 3.14
pi = "원주율";
console.log(pi); // -> 원주율
이처럼 실행할 때 변수에 저장된 데이터 타입을 동적으로 바꿀 수 있는 언어를 가리켜 동적 타입 언어라 한다.
값이 없음을 표현하기 위한 특수한 값에는 null
과 undefined
가 있다.
undefined
는 정의되지 않은 상태를 뜻하며 다음과 같은 경우에 발생한다.
null
은 아무것도 없음을 값으로 표현한 리터럴이며 다음과 같은 경우에 발생한다.
심벌은 자기 자신을 제외한 그 어떤 값과도 다른 유일무이한 값으로, 충돌 위험이 없는 유일한 객체의 프로퍼티 키를 만들기 위해 사용한다.
let symbolWithDesc = Symbol('ungmo2');
console.log(symbolWithDesc); // Symbol(ungmo2)
console.log(symbolWithDesc === Symbol('ungmo2')); // false
Symbol() 함수에는 문자열을 인자로 전달할 수 있다. 이 문자열은 Symbol 생성에 어떠한 영향을 주지 않으며 다만 생성된 Symbol에 대한 설명(description)으로 디버깅 용도로만 사용된다.
// 전역 Symbol 레지스트리에 foo라는 키로 저장된 Symbol이 없으면 새로운 Symbol 생성
const s1 = Symbol.for('foo');
// 전역 Symbol 레지스트리에 foo라는 키로 저장된 Symbol이 있으면 해당 Symbol을 반환
const s2 = Symbol.for('foo');
console.log(s1 === s2); // true
Symbol.for 메소드는 인자로 전달받은 문자열을 키로 사용하여 Symbol 값들이 저장되어 있는 전역 Symbol 레지스트리에서 해당 키와 일치하는 저장된 Symbol 값을 검색한다. 이때 검색에 성공하면 검색된 Symbol 값을 반환하고, 검색에 실패하면 새로운 Symbol 값을 생성하여 해당 키로 전역 Symbol 레지스트리에 저장한 후, Symbol 값을 반환한다.
const shareSymbol = Symbol.for('myKey');
const key1 = Symbol.keyFor(shareSymbol);
console.log(key1); // myKey
const unsharedSymbol = Symbol('myKey');
const key2 = Symbol.keyFor(unsharedSymbol);
console.log(key2); // undefined
Symbol.for 메소드를 통해 생성된 Symbol 값은 반드시 키를 갖는다. 이에 반해 Symbol 함수를 통해 생성된 Symbol 값은 키가 없다.
템플릿 리털을 사용하면 표현식의 값을 문자열에 추가하거나 여러 줄의 문자열을 표현할 수 있다.
let a = 1;
let b = 10;
console.log('1 * 10 is ' + (a * b)); // 1 * 10 is 10
------------------------------------------------------------------
let a = 1;
let b = 10;
console.log(`1 * 10 is ${a * b}`); // 1 * 10 is 10
let text = "Hello, \
my name is Alberto \
how are you? \ ";
------------------------------------------------------------------
let text = `Hello,
my name is Alberto
how are you?`;