JS는 다른 언어와 다르게 하나의 숫자 타입만 제공하는데 64bit 부동소수점 형식을 따른다
즉, 모든 수를 실수로 처리한다
따라서 정수끼리 나누기를 해도 실수가 나올 수 있는 것이다
숫자타입의 특별한 값 3가지가 있다
JS에서 문자열은 C(문자의 배열), JAVA(객체) 와 다르게 원시타입이며 변경 불가능한 값이다.
일명 백틱(``)이라고 불리는 문자열 표기법으로 여러가지 문자열 처리기능(멀티라인 문자열, 표현식 삽입, 태그드 문자열, … )을 제공한다
Cf)
const test = [1 + "1", "1" + 1, 1 + 1 + "1", 1 + "1" + "1", 1 + 1 + 1];
test.forEach((v) => {
console.log(typeof v, v);
});
/* 출력값
string 11
string 11
string 21
string 111
number 3
*/
true | false 타입이다
undefined타입은 undefined이 유일하다
undefined는 개발자가 의도적으로 할당하기 위한 값이 아니라 JS엔진이 변수를 초기화 할때 사용하는 값이다.
즉, 변수를 참조했을때 undefined가 반환된다면 참조한 변수가 선언 이후 할당된 값이 없다는 뜻이고 개발자가 뭔가 잘못했다는 힌트를준다.
따라서 undefined를 의도적으로 변수에 할당하는 것은 취지에 어긋나고 혼란을 야기한다
변수에 값이 없다는 것을 명시하고 싶을때는 undefined가 아닌 null을 할당한다
null 타입도 null이 유일하다
null은 변수에 값이 없다는 것을 의도적으로 명시할 때 || 이전에 참조된 값을 더이상 참조하지 않겠다는 의미로 사용한다.
ES6에서 추가된 타입으로 변경 불가능한 원시 타입이다. 심벌 값은 다른 값과 중복되지 않는 유일한 값이다.
이러한 특성을 이용하기 위해 이름 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용된다
다른 원시타입과는다르게 Symbol함수를 호출해 생성해야한다.
JS의 데이터 타입은 원시타입 6개와 객체 타입으로 나뉜다. JS를 이루고있는 거의 모든 것이 객체이다.
값은 메모리에 저장되고 참조될 수 있어야 한데 메모리에 값을 저장하려면 먼저 확보할 메모리의 크기를 정해야한다.
이때 메모리 손실없이 값을 저장하기 위해 데이터의 타입을 이용한다.
이제 데이터를 저장했다면 변수를 참조할때 식별자를 통해 값의 주소값을 불러온다. 정확히 말하면 값이 저장되어있는 메모리 공간의 선두 메모리 셀의 주소를 불러온다.
이때 몇개의 셀을 읽어야 하는지를 알기위해 데이터 타입을 이용한다.
메모리에는 모두 2진수로 값이 들어간다 따라서 메모리에 저장된 값 0100 0001은 숫자로 해석하면 65, 문자열로 해석하면 “A”가 된다.
이때 메모리 타입을 이용해서 읽어들인 메모리 셀의 2진수 값을 해석한다.
정리하면 데이터에 타입이 필요한이유는
이다.
C, JAVA같은 정적 타입언어는 변수를 선언시 변수에 할당할 수 있는 데이터의 타입을 미리 선언해야한다. 이런 정적타입 언어는 컴파일 시점에 타입체크를 통해 변수에 선언한 데이터 타입의 값이 잘 할당 되었는지 검사하고 통과하지 못하면 프로그램 실행을 막는다.
하지만 우리의 킹갓JS는 그딴거 없다.
Why???
JS의 변수는 ‘선언’이 아닌 ‘할당’에 의해 타입이 결정(타입추론,type interence)된다. 그리고 재할당에 의해 변수의 타입은 동적으로 바뀐다.
이거시 바로 무근본 동적언어.
즉, 정확이 말하면 변수는 타입이 없다. 변수는 그냥 할당된 값에 대한 별칭이며 변수의 타입이 아니라 변수에 할당된 값의 타입이다.
이러한 동적 타입 언어는 유연해서 좋은데 유연해서 신뢰성이 바닥이다.
따라서 동적언어에서 변수를 잘 사용하는 Tip이 있다.
정말 잘 읽었습니다, 고맙습니다!