JavaScript (JS)
ECMAScript
브라우저에서 사용되는 JS 같은 것들은 모두 ECMAScript를 토대로 한다.
옛날 JS는 브라우저마다 함수와 기능이 달랐었다. 그래서 ECMAScript 명세에 맞추어 만들기로 하였고, 이게 표준이 되었다.
use strict 모드
자바스크립트의 장점은 자유롭다는 거지만 이게 단점으로 적용하여 디버깅하기가 힘들 수 있다.
use strict 모드를 사용하면 문법 검사를 브라우저 자체에서 타이트하게 해 준다.
JavaScript 자료형
Boolean 타입
논리 요소를 나타낸다.
true와 false 두 가지 값이 존재한다.
Null 타입
null 하나의 값만을 가질 수 있다.
Undefined 타입
값을 할당하지 않은 변수가 가지는 타입이다.
Null 타입과 Undefined 타입은 똑같다고 생각될 수 있지만 엄연히 다른 타입이다.
null은 변수를 선언하고 빈 값이 할당된 것이고, undefined는 변수를 선언했지만 값을 할당하지 않은 것이다.
Number 타입
-(2^53 - 1)부터 (2^53 -1)까지의 수
이 외에도 +Infinity, -Infinity, NaN이라는 상징적 값을 갖는다.
0은 -0과 +0, 두 가지 방법으로 표현할 수 있다(0은 +0의 별칭).
-0과 +0의 차이가 영향을 주는 것은 거의 없다고 하나, 0으로 나누는 상황에서 +0으로 나누게 되면 +Infinity 값이 나오고 -0으로 나누면 -Infinity 값이 나온다.
String
문자열로, 텍스트 데이터를 나타낼 때 사용한다.
Object
Object 클래스, 배열, 함수, 사용자 정의 클래스 모두 객체 자료형에 포함된다.
앞서 설명한 자료형들은 기본형 자료형으로 Call by Value이지만 객체 자료형은 Call by Reference이다.
var, let, const
var 키워드는 중복 선언이 가능하고 함수 외부에서 선언한 변수는 모두 전역 변수로 선언되므로 코드량이 많아졌을 때 어느 부분에서 문제가 발생하는지 정확히 파악하기 힘들 수 있다. 따라서 let과 const 사용을 권장한다.
let 키워드는 중복 선언이 불가능하나 재할당은 가능하다.
const 키워드는 중복 선언과 재할당 모두 불가능하다.
var varV = 'VAR1';
var varV = 'VAR2';
let letV = 'LET1';
let letV = 'LET2';
같은 변수 이름인 경우 var 키워드로 선언한 변수는 오류 없이 실행되지만, let 키워드로 선언한 변수는 '변수명' has already been declared라는 오류가 발생한다.
=> var는 변수 재선언이 되지만 let은 변수 재선언 불가능
let name = 'kim';
name = 'lee';
const age = 13;
age = 15;
let 키워드로 선언된 name 변수는 'lee' 값으로 재할당 되었지만 const 키워드로 선언된 age 변수는 15로 재 할당되지 않고 오류가 발생한다.
=> var, let은 재할당 되지만 const는 재할당 불가능
호이스팅
스코프 안에 있는 선언들을 모두 스코프의 최상위로 끌어올리는 것으로, 미리 선언문을 실행하는 것이라 생각하면 되고 실제 메모리에서는 변화가 없다.
var 키워드나 함수 선언문 같은 경우 코드 실행 전에 자바스크립트 내부에서 미리 변수를 선언하고 undefined로 초기화를 해둔다.
let 키워드, const 키워드와 함수 표현식은 호이스팅이 발생하긴 하나, 변수를 선언만 해놓을 뿐 초기화하지 않는다. 초기화는 변수 선언문을 만났을 때 수행한다. 이때 선언과 초기화 사이에 일시적으로 변수 값을 참조할 수 있는 구간을 TDZ(Temporal Dead Zone)이라 일컫는다.
스코프(Scope)
변수에 접근할 수 있는 범위로, global과 local 두 가지 타입이 있다.
블록 레벨 스코프를 사용하는 대부분 프로그래밍 언어들과는 달리 var 키워드는 함수 레벨 스코프를 가지고 있다.
함수 레벨 스코프
함수 내에서 선언된 변수는 함수 내에서만 유효하다.
함수 내부에서 선언한 변수는 지역 변수이고, 함수 외부에서 선언한 변수는 전역 변수이다.
블록 레벨 스코프
코드 블록 내에서 선언된 변수는 코드 블록 내에서만 유효하다.
{
var temp1 = 'temp1';
}
console.log(temp1);
{
let temp2 = 'temp2';
}
console.log(temp2);
var 키워드는 함수 레벨 스코프이므로 블록 안에서 선언한 변수를 블록 바깥에서도 사용할 수 있다. 이와 달리 let은 블록 레벨 스코프 이므로 블록 내에서 선언한 변수를 블록 바깥에서 사용할 시 오류가 발생한다.
위 예제에서 var 키워드로 선언한 temp1 같은 경우는 함수가 아닌 곳에서 선언한 것이므로 전역 변수로 취급된다.