var
, let
, const
키워드를 사용. 하지만 var
는 ES6 이후 권장하지 않음.const
는 단 한 번만 할당 가능한 변수로 재선언, 재할당 모두 불가능 상수(constant)라 한다.var
키워드 대표적인 문제점undefined
초기값으로 할당되어 진다.var
호이스팅 문제란?호이스팅은 소스코드가 순차적으로 실행되는 런타임 이전 단계에서 선언문이 동작되는 것 의미.
console.log(score); // undefined
var score;
var
, let
, const
, function
, funtion*
, class
키워드를 사용시 모두 런타임 이전 단계에서 먼저 실행(호이스팅) 된다. 다만, 위 소스코드 처럼 console.log(score)
실행되는 시점에는 아직 var score
선언되기 이전이므로 참조 에러가 발생되는게 정상이지만, var
경우 undefined
가 출력이 되는 문제로 개발 과정에서 혼란이 가중된다.
var
블록 스코프 문제란?예를 들어 아래 for
문 안 블록 스코프 벗어나 변수가 참조되는지 여부로 let
과 다르게 var
는 for
문 안이든 밖이든 문제없이 i
에 접근하여 값을 출력한다.
let
for (let i = 0; i < 10; i++) {}
console.log(i); // i is not defined
var
for (var i = 0; i < 10; i++) {}
console.log(i); // 10
const
)읽기만 가능한 즉 변경할 수 없는 변수값을 지정하는 것으로 크게 3가지에 장점을 가지고 있다.
const result = 10;
result = 100; // Type Error
{}
로 둘러싸인 부분을 말한다.{
let name = "ellie";
console.log(name); // ellie
}
console.log(name); // 아무값도 출력되지 않는다.
let name = "ellie";
{
console.log(name); // ellie
}
console.log(name); // ellie
변수(variable)가 메모리에 저장되는 방식은 원시(primitive) 타입과 또는 객체(object) 타입 두 가지로 구분한다.
구분 | 데이터 타입 | 설명 |
---|---|---|
숫자 타입 | 숫자. 정수와 실수 구분 없이 하나의 숫자 타입만 존재 | |
문자열 타입 | 문자열 | |
원시 타입 | undifined 타입 | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 |
(primitive type) | null 타입 | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 |
심볼 타입 | ES6에서 추가된 7번째 타입 | |
객체 타입 (object Type) | 객체, 함수, 배열 등 |
object
가 가르키는 참조(reference)가 메모리에 저장됩니다.양의 number 타입을 0으로 나누거나, 음의 number 타입을 0으로 나눌때 결과
const infinity = 1 / 0;
console.log(infinity); // Iinfinity
const negativeInfinity = -1 / 0;
console.log(negativeInfinity); // -Iinfinity
숫자가 아닌 것을 number와 연산을 했을 경우
const num = 2 * 2;
console.log(`${typeof num} : ${num}`); // number : 4
const nAn = "string" * 2;
console.log(`${typeof nAn} : ${nAn}`); // number : NaN
+
연산자 없이 문자열 연결 연산자로 동작된다.console.log("1 + 2 = " + (1 + 2)); // 1 + 2 = 3
console.log(`1 + 2 = ${1 + 2}`); // 1 + 2 = 3
일반 문자열에서는 줄바꿈 넣으면 토큰(token)에러가 발생된다. 개행이 필요한 경우 이스케이프 시퀀스(escape sequence)를 사용하거나, 템플릿 리터럴 표기법으로 표현해야된다.
var string = 'Hellog
World'
console.log(string);
// Invalid or unexpected token
var string = `<p>Hello
World</p>`;
Hello
World
var string = "<p>Hello \n World</p>";
Hello
World
표현식을 삽입하려면 ${}
으로 표현식을 감싼다. 표현식 결과는 문자열이 아니더라도 문자열로 취급된다.
var first = "ji-hun";
var last = "jang";
console.log(`My name is ${first} ${last}.`); // My name is ji-hun jang.
불리언 타입(boolean type)의 값은 논리적 참(true
), 거짓(false
)뿐이다.
false
= 0
, null
, undefined
, NaN
, ''true
= false
를 제외한 모든 값연산자를 이용하여 어떤 조건이 참(true
)인지 거짓(false
)인지를 나타내기 위해 사용된다.
1 > 2; // false
true && false; // false
자세한 내용 : https://helloworldjavascript.net/pages/150-boolean.html
null
null
은 변수에 값이 없다는 것을 의도적으로 명시 할 때 사용Null
반환한다.var foo = null;
console.log(foo); // null
console.log(Boolean(foo)); // false
var element = document.querySelector(".myClass"); // .myClass란 노드는 없는 상태임
console.log(element); // null
undefined
undefined
를 직역하면 "정의되지 않은"이다.var
가 선언은 되어 있지만 값이 지정되지 않은 상태임var foo;
console.log(foo); // undefined
console.log(Boolean(foo)); // false
undefined
는 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값으로 개발자가 의도적으로 변수에 undefined
를 할당하는 것은 본래 취지에 어긋난다. 변수가 없다는 것을 명시하고자 하는 경우 null
할당하는 것이 정확하다.
C, Java에 정적 타입 언어로 경우 변수를 선언할때 데이터 타입을 사전에 선언한다.
char str // string
int num // number
자바스크립트는 변수를 선언할 때 타입을 선언하지 않으며, 값이 할당하는 시점 변수의 타입이 동적으로 결정되고 변수의 타입은 언제든지 자유롭게 변경(재할당)할 수 있다.
그래서 자바스크립트는 동적 타입 언어라 한다.
var foo = "Hello";
console.log(`typeof ${foo}`); // string
foo = 3;
console.log(`typeof ${foo}`); // number
암묵적 타입 변환 같은 문제로 동적 타입 언어는 유연성은 높지만, 신뢰성은 떨어지므로 다음과 같은 사항을 주의하자.