(1) Variable (변수)
(2) let(mutable data type)
let name // name이란 이름으로 선언
let name = 'kim'; // 'kim'이란 값을 할당
console.log(name); // kim
name = 'lee'; // let은 값을 재할당 가능
어플리케이션을 실행하게 되면 어플리케이션마다 쓸 수 있는 메모리가 할당된다.
메모리는 비어져 있는 상자라고 생각하면 되는데, 어플리케이션마다 쓸 수 있는 상자는 한정적이다.

위 코드를 예를 들어 설명하자면, name이라는 이름으로 선언을 하면
하나의 박스를 가리키는 포인터가 생기게 되는 것이다.
name이라는 변수가 가리키는 메모리 어딘가에 kim이라는 값을 저장할 수 있다.
{
let name = 'kim';
console.log(name); // 'kim'
name = 'lee'
console.log(name); // 'lee'
}
console.log(name); // 블럭 밖에선 블럭 안에서 정의된 변수에 접근 불가
let globalscope = 'global name'
{
let name = 'kim';
console.log(name); // 'kim'
name = 'lee'
console.log(name); // 'lee'
console.log(globalname); // 'global name'
}
console.log(name); // 블럭 밖에선 블럭 안에서 정의된 변수에 접근 불가
console.log(globalname); // 'global name'
global scope는 어디서나 접근 가능하다.
console.log(age); // undefined 정의는 되어 있으나 값이 없다. 값을 할당하기 전에도 출력할 수 있다.
age = 4;
var age;
호이스팅은 어디에 선언했는가 상관없이 항상 선언을 제일 위로 끌어올려주는
{
age = 4;
var age
}
console.log(age); // 4
age를 블록 안에서 선언했음에도 불구하고 블록 밖에서 출력했을 시 출력이 된다.

메모리 어딘가에 할당된 박스를 가리키는 포인터를 이용해 값을 바꿔나갈 수 있는 let과 달리
Constants는 이 포인터가 잠겨있어 선언과 값을 할당하는데 있어 변경을 할 수가 없다
보안상의 이유 그리고 어플리케이션의 효율성으로 인해
✔ number, string, boolean, null, undefined, symbal
값 자체가 메모리에 저장된다.
function
크기가 크기 때문에 메모리에 그대로 저장될 수 없다.
object를 할당하면 그 곳에는 reference가 존재하는데, 이 reference를 통해 object가 담겨있는 메모리를 가리키게 된다.
infinity
negativeInfinity
NaN
나누고자 하는 값이 0인지 숫자인지 확인하지 않고 나눔을 진행하게 된다면
에러가 발생한다.


✔ 0, null, undefined, NaN, '' 값은 모두 false에 해당한다.
null은 값이 없는 상태
undefined 선언은 되었지만 값이 지정되어있지 않은 상태

✔ 고유한 식별자를 만들 때 사용된다.
(동일한 String을 사용했어도 symbol은 다르다)
만약 String이 똑같고 동일한 symbol을 만들고 싶다면 Symbol.for라는 키워드를 사용하면 된다.
const gSymbol1 = Symbol.for('id');
const gSymbol2 = Symbol.for('id');
console.log(gSymbol1 === gSymbol2); // true
변수를 선언할 때 어떤 타입인지 선언하지 않고 프로그램이 동작할 때 할당된 값에 따라 타입이 변경될 수 있다.

let은 재할당이 가능하기 때문에 text라는 변수를 숫자 1로 재할당이 가능하고

중요한 것은 String 7과 Number 5를 더하게 되면 문자로 인식하여 String 75를 반환하고
String 8 과 String 2를 나누면 숫자 나누기 숫자로 인식하여 Number 4를 반환하게 된다.