
변수에는 형식이 있다. 이를 자료형이라고 한다.
JavaScript의 자료형은 원시 값(primitive type)과 객체(object)로 나뉜다.
원시 값 : 언어의 최고 로우레벨에서 직접 표현되는 불변 데이터
Boolean : 논리 요소를 나타내며 true 와 false 두 가지의 값을 가질 수 있다.
Null : null 하나의 값만 가질 수 있다.
Undefined : 값을 할당하지 않은 변수는 undefined값을 가진다.
Number : -(2^53-1)부터 2^53-1까지의 수의 값을 가진다. 부동 소수점 숫자 외에도 +Infinity , -Infinity , Nan("Not a Number") 세 개의 상징적인 값을 가진다.
BigInt : 임의 정밀도로 정수를 나타낼 수 있는 JavaScript 숫자 원시 값이다. Number의 안전 한계를 넘어서는 큰 정수도 안전하게 저장하고 연산할 수 있다.
String : 텍스트 데이터를 나타낼 때 사용한다. 16비트 부호없는 정수 값 "요소"로 구성된 집합으로, 각각의 요소가 String의 한 자리를 차지한다.
Symbol : 고유하고 변경 불가능한 원시 값이며 객체의 속성 키로 사용할 수 있다.
객체 :
식별자로 참조할 수 있는 메모리 상의 값. 참조타입(Reference Type)이라고도 한다.
속성의 컬렉션으로 볼 수 있다.
객체 리터럴 구문을 사용하여 제한적으로 속성을 초기화할 수 있고, 그 후에 속성을 추가하거나 제거할 수도 있다.
속성 값으로는 다른 객체를 포함해 모든 자료형을 사용할 수 있으므로 복잡한 자료구조의 구축이 가능하다.
속성은 '키' 값으로 식별하며, 키 값으로는 문자열 값이나 심볼을 사용할 수 있다.
let myNameAge = {name: "Jun", age: 26}
type of 연산자는 피연산자의 평가 전 자료형을 나타내는 문자열을 반환한다.
console.log(typeof 100); // expected output: "number"
console.log(typeof "Hello"); // expected output: "string"
console.log(typeof true); // expected output: "boolean"
console.log(typeof undeclaredVariable) // expected output: "undefined"
JavaScript는 느슨한 타입(loosely typed)의 동적(dynamic) 언어이다.
변수는 어떤 특정 타입과 연결되지 않으며, 모든 타입의 값으로 할당 (및 재할당) 가능하다.
let foo = 42 // typeof foo = "number"
foo = 'bar' // typeof foo = "string"
foo = true // typeof foo = "boolean"
다른 언어에서는 동치연산자로 ==가 쓰이지만 JavaScript에선 ===를 쓴다.
== 를 쓰지 못하는것은 아니지만 차이점이 존재한다.
== 은 두 값이 같은 지 비교한다. 두 값을 공통(common) 형태로 변환한 후에 비교한다.추상적(abstract) 같음 비교. 느슨한(loose) 같음이라고도 한다.
/* loose(abstract) equality */
console.log(1 == true); // output = true
console.log(0 == false); // output = true
console.log(1 == '1'); // output = true
console.log(null == undefined); // output = true
=== 은 어느 값도 비교되기 전에 다른 값으로 변환되지 않는다. 그렇기에 자료형이 다르면 둘은 같지 않다고 여겨진다. 더 바람직한 비교 방법이다.
===: 엄격한(strict) 같음 비교.
/* strict equality */
console.log(1 === true); // output = false
console.log(0 === false); // output = false
console.log(1 === '1'); // output = false
console.log(null === undefined); // output = false