개인적으로 굉장히 중요하다고 여기는 파트.
나중에 타입스크립트를 배우게 될 때 이 부분의 이해가 잘 박혀있으면 도움 많이 될 듯 싶다.
자바스크립트는 7개의 데이터타입을 가지고 있고 이는 원시타입과 객체 타입으로 나뉜다.
- 원시타입 : number, string, boolean, undefined, null, Symbol
- 객체타입 : 객체, 함수, 배열 등
정수 실수 2진수 8진수 16진수 리터럴은 모두 부동소수점 형식의 2진수로 저장되기 때문에 모든 수를 실수로 정의한다.
그렇기 때문에 정수로 표시되는 수끼리 나누더라도 실수가 나올 수 있다.
console.log(1===1.0) //true
또한 숫자 타임에는 Infinity, -Infinity, NaN 값을 표현할 수 있는데
console.log(10/0); // Infinity
console.log(10/-0); // -Infinity
console.log(1*'String')//NaN
var string;
string='ㅁㅁ';
string="ㅁㅁ";
string=`ㅁㅁ`;
ES6부터 도입된 개념. `` 백틱을 사용하여 표현한다. 백틱 안에서 멀티라인 문자열 등 기능을 사용할 수 있다.
console.log(`my name is ${변수명}`);
이런식으로 사용 ㄱㄴ. 이런 방식은 꼭 템플릿 리터럴 내부에서 사용해야 의도대로 동작한다.
논리적 참과 거짓을 나타내는 true false가 있음.
자바스크립트 엔진의 동작원리에서 한 번 공부한 적 있지만 var 키워드는 선언과 동시에 전역 컨텍스트에서 undefined 로 초기화된다. 가비지 값이 들어있더라도 선언과 동시에 undefiend 로 초기화되기 때문에 할당 없이 변수를 참조해도 undefined 가 반환된다.
이처럼 undefined 는 개발자의 의도가 아니라 자스엔진에 의해 발생되는 값이므로 의도적인 비움 값을 주고 싶다면 null 을 사용하는 것을 권장한다.
자바스크립트는 대소문자를 구분하므로 null, Null, NULL 과는 다르다. 의도적인 부재를 위해 할당한다면 'null'로 사용하기!
변수에 null 을 할당한다는 의미는 변수가 이전에 참조하던 것을 더 이상 참조하지 않겠다는 의미임.
함수가 유효한 값을 반환할 수 없는 경우 명시적 null 을 반환하기도 함.
<!DOCTYPR html>
<html>
<body>
<script>
var element = document.querySelector('.myClass');
console.log(element); //null
</script>
</body>
</html>
조건에 부합하는 html요소를 검색할 수 없는 경우 null 이 반환된다.
ES6에서 추가된 타입으로 변경 불가능한 원시 타입의 값이라고 한다. 일단 직관적으로 이해가 잘 안됨..
다른 값과 중복되지 않는 유일무이한 값이기 때문에 객체의 유일한 프로퍼티 키를 만들기 위해 사용된다 - ?
다른 값들은 리터럴로 생성하지만 심벌은 함수를 통해 생성함.
var key=Symbol('key');
console.log(typeof key);
자바스크립트의 대부분은 객체로 이루어져 있다. 앞서 살펴본 6가지 외에는 모두 객체로 이루어져있다. 뒷장에서 좀 더 자세히 살펴보자.
단, ECMAScript 사양은 문자열과 숫자 이외에 데이터 타입 크기를 명시적으로 규정하고 있지는 않다.
값을 참조할 때를 생각해보자. 메모리에서 데이터를 읽어올 때 대체 어디부터 어디까지가 숫자 하나라고 볼 수 있을까? 데이터 타입이 정해져 있기 때문에 타입별로 미리 정해진 크기만큼만 읽는 방식으로 데이터를 구분할 수 있는 것이다.
모든 데이터는 2진수로 저장된다. 참조하여 읽어올 때 이게 숫자인지 문자열인지 어떻게 구분할까? 이 때 데이터 타입이 필요하다.
2진수 1000001 의 경우 숫자라면 65, 문자라면 A이다. 이를 알맞게 구분하기 위해 데이터 타입이 있어야 하는 것이다.
흔히 C,C++,자바,코틀린과 같은 언어를 정적 타입 언어라고 부르고 php, 자바스크립트 등의 언어를 동적 타입 언어라고 부른다.
이러한 개념이 무엇인지 이해해보자.
char c;
string str;
int num;
c언어와 같은 정적타입 언어같은 경우에는 변수를 선언할 때 데이터 타입이 결정된다. 컴파일 시 타입체크가 일어나고 이 때 올바른 타입이 들어가지 않았다면 에러를 발생시킨다. 그렇기 때문에 좀 더 강력한 데이터 타입의 규제가 일어나는 것이다!
반면,
var str="aa"; //typeof 로 찍으면 string
var num=5 //number
var sy=Symbol(); //Symbol
...
자바스크립트 같은 경우에는 var, let, const 키워드로 변수를 선언할 뿐 데이터 타입을 명시하지 않는다. 즉, 변수에 데이터 값이 할당될 때 타입이 결정 되는 것이다. 이것을 동적 타이핑이라고 한다.
다시 한 번 정리하자면 정적 타입 언어는 변수가 선언될 때 타입이 결정되고 동적 타입 언어는 변수에 데이터가 할당 될 때 타입이 결정된다.