1. 자바스크립트의 타입_1

악음·2021년 7월 6일
2

i will know javascript

목록 보기
2/12
post-thumbnail

자바스크립트의 타입을 알아보자

1. 타입(type)

자바스크립트 같은 동적언어는
(코드가 컴파일시에 자료형이 정해지는 것이 아닌 실행할 때 정해지는것 인터프리터 언어의 특징이다.)
타입 개념이 없다고 생각하지만 사실 ECMA 5.1에선 다음과 같이 명세하고있다.

  1. 이 명세에 수록된 알고리즘에서 사용되는 모든 값은 이절에서 정의한 타입 중 하나에 해당한다. 타입은 ECMAscript 언어 타입과 명세 타입으로 하위 분류된다.
  2. ECMAScript 개발자가 ECMAScript언어를 이용하여 직접 조작하는 값들의 타입이 바로 ECMAScript 언어 타입이다. ECMAScript 언어 타입에는 Undefined, Null, Boolean, Stirng, Numbre, Object 가있다.

엄격 타입(정적타입 자료형이 컴파일시에 정해지는 언어)언어 개발자들을(책에는 광팬으로나옴)
ECMAScript 5.1 명세에 나온 타입의 정의를 반대할지도모른다 정적인 언어의 타입은 ECMAScript보다 훨씬더 많은 의미를 내포하고 있기 때문이다.

하지만 ECMAScript 5.1에선 분명 자바스크립트 엔진과 개발자 모두 어떤값을 다른값과 "분별" 할 수 있는 고유한 내부 특성의 집합이 있다고 명시하고있다.

사실 우리가 자바스크립트를 하는 이유도 이러한 타입이 비교적 유연하기 때문이 아닐까 싶다 너무 엄격하고 진지하지 않은 언어이기 때문에 누구나 접하기 쉬운 언어이기 때문이다.
(추후 typescript를 통해 js가 접하기쉽기 때문에 생기는 문제점을 훌륭하게 커버 할 수도 있다)

1.1. 타입 그 실체를 이해해보자

뭐 그렇다 ECMA 5.1 명세에 타입이 있다고하는대 주변에서 넌 타입이 아니야! 라고 외쳐봤자 안들릴 뿐이다 뭐 어쩌라고? 아무튼 우리는 ECMA 5.1 에서 명세한 타입들을 정확히 알고 유용하게 써먹으면 그뿐이다
또한 정확히 알아야하는 이유중 하나는 자바스크립트에서 강제변환이 일어나므로 확실하게 인지하고 사용하는것이 중요하다.

1.2. 내장타입

각설하고 ECMAScript(이하 javascript)의 타입이 무엇이 있는지 araboja

  1. null
  2. undefined
  3. boolean
  4. number
  5. string
  6. object
  7. symbol(ES6 부터 추가 이거 나도 개발하면서 본적이없다 따로정리 해 두자)

이중 object를 제외한 타입들을 원시타입(primitives)
위에 타입들을 연산자 typeof 로 판별할 수 있다.
놀랍게도 책에서는 각 타입들이 항상 1:1로 정확히 매칭되지 않는다고 한다

typeof undefined==="undefined" // true
typeof true==="boolean" // true
typeof 42==="number" // true
typeof "42"==="string" // true
typeof {amIknowjs:false}==="object" // true
typeof Symbol()==="symbol" // true (ES6 부터 추가)

위에 예제의 6개 타입은 자신의 명칭과 동일한 문자열과 매치시켰을때 true를 반환한다.
위에 7개의 타입이 있는대 왜 6개만 비교했냐고 물으신다면 null 고녀석은 약간 버그같이
보여서 따로 뺐다고 한다. (책이 밀땅한다 그냥 알려주지)

typeof null ==="object" 이건 당연히 false이어야 하지만 true을 반환한다 왤까?
null은 Object 인것일까?
방금 콘솔에 넣어봤는데;; typeof null ==="null"은 false이다..?

책에선 null을 반환하면 좋겠다고한다 심지어 이것이 정답이라고한다 왜그런진 모르겠지만..
사실 이 버그같은 캐이스는 20년동안 끈덕지 게 버텨왔다고한다 그리고 이제와서 바꾸자니
이미 이런식으로 만든 소프트웨어들이 또다른 버그를 토해낼 것이기 때문에..
앞으로 해결될 가능성은 거의 없지 않을까 싶다.
그리고 이타입을 좀더 정확하개 판별하는 방법이 있다고한다.
const a = null a가 null인지 아닌지 판별하는 방법

(!a && typeof a ==="object") //true

왜 위와 같은 판별식을 사용할까? 라고 생각해 본다면 아래와 같다
null의 반대는 true 이고 이때 a가 object이면 a는 null이 맞다는 결론이 나온다
(boolean의 false와 null 제외한 타입은 반대일경우 (!가 붙은 상태) 모두
false를 반환하니 &&에서 걸러진다 그리고 boolean의 false일 경우에도 typeof a에서 "object"와 비교함으로써 걸러진다)
즉 null은 반대타입이 true이면서 object타입 일때 null이라고 할수있겠다
(까다로운 녀석 ㅋ)
즉 null은 falsy한 object인 특별한 존재이다.

또하나 추가하자면 typeof 으로 function을 비교할 수 있다.

const a=()=>{}
typeof a ==='function' // true

판별식을 보면 function이 최상위 레벨의 내장 타입 처럼 보인다고 한다
(왤까?.. 그냥 또 다른 타입이라고 생각되어지는데;;)
아무튼 실제로는 object의 하위 타입이라고한다 구채적으론 호출가능한 객체(callable object)라고 명시되어있다.
(내부 프로퍼티 call 로 호출할 수 있는 객체 라고한다)

무엇보다 함수가 객채라서 유용한 이유는
(그래서 펑션을 객채선언(인스턴스선언)할수 있던거구나)
프로퍼티를 둘수있다는 점이다 (파라미터)

function a(b,c){} 이런식으로
신기하게도 a.length 으로 함수의 프로퍼티 갯수를 알수있다.

그리고 우리 js에서 가장많이 쓰이는 자료형중에 하나인 배열은 어떨까?

typeof [1,2,3] ==="obejct" 과연 결과는 두둥???
= 응 true 너도 객체야

object는 키값이 string인 반면 배열은 키값이 number인 (즉 인덱스)객체이며 length 프로퍼티가 자동으로 관리된다 배열역시 object의 하위 타입이다.

1.3. 값은 타입을 가진다

값에는 타입이 있지만 변수엔 따로 타입이라는것이 없다. 즉 언제라도 어떠한 값이 와도 받아줄수 있다.

(언제라도 어떠한 값이라는 표현은 es6에 들어오면서 부터 "부분적"으로 맞다 그 이유는 const 선언인데 블록 범위 상수이다 const 선언은 해당 변수에 값을 "재할당"할수없도록한다.
재할당 할수 없으므로 타입이 바뀔일도 없다.)

순수 js에서는 타입을 강제 하지 않는다 재할당 된 값이 처음 할당된 값과 같은 타입일 필요는 없다.

  1. 42는 내장된 숫자타입이고 이타입은 절대로 바꿀 수 없다.
  2. 그리고 "42"는 문자열 타입이지만 42에서 강제변환을 거처 생성할 수 있다.
  3. typeof 연산자에 변수를 대보는건 언뜻 보면 변수의 타입을 물어보는 질문 같지만
    변수엔 타입이라는 개념이 없으므로 "이 변수에 들은 값의 타입이 무엇이니?"라고
    묻는 것이다.
var a = 42
typeof a // "number"
a =true 
typeof a //"boolean"

typeof 연산자의 반환값은 언제나 문자열이다.(typeof 연산자에 typeof를 대보면??)

typeof typeof 42 는 "string"이다.

profile
RN/react.js개발자이며 배운것들을 제가 보기위해서 정리하기 때문에 비속어 오타가 있을수있습니다.

0개의 댓글