데이터 타입(Data Types)

Steve·2021년 12월 4일
0

데이터 타입의 종류

  • 원시 타입(Primitive Type): number, string, boolean, undefined, null, symbol, bigint
  • 객체 타입/참조 타입(Object/Reference Type): object, function, array, regex 등

** 숫자, 문자열 등의 변수의 메소드를 사용할 수 있는 이유: 래퍼 객체(Wrapper Object) 때문

레퍼(wrapper)객체는 원시 타입을 마치 객체 타입처럼 사용하는 과정 속에서 생기는 임시 객체이다. 원시 타입인 String, Number, Boolean으로 특정된다.

이는 원시값인 문자열, 숫자, 불리언 값의 경우 이들 원시값에 대해 마치 객체처럼 마침표 표기법 (.) 으로 접근하면 자바스크립트 엔진이 일시적으로 원시값을 연관된 객체로 변환해 주기 때문이다.

즉, 원시값을 객체처럼 사용하면 자바스크립트 엔진은 암묵적으로 연관된 객체를 생성하여 생성된 객체로 프로퍼티에 접근하거나 메서드를 호출하고 다시 원시값으로 되돌린다.

https://curryyou.tistory.com/184

** 심볼(symbol)은 ES6에서 새롭게 추가된 7번째 타입으로 변경 불가능한 원시 타입의 값이다. 심볼은 주로 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키(property key)를 만들기 위해 사용한다.

undefined 와 null 의 차이

undefeind : 값이 할당되지 않았을 때, 자바스크립트 엔진이 암묵적으로 초기화하는 값
null : 의도적으로 값이 없음을 명시하기 위해 할당하는 값.

** typeof(null)은 object 로 뜨는데 이건 버그이므로 === 일치연산자를 사용하는게 좋다.

원시값과 참조값의 개념과 차이점

원시값

원시값은 boolean, string, number 등으로 이 값들은 컴퓨터의 stack memory 에 저장한다.
변경 불가능한 값(immutable value)다.
변경 불가능하다는 말은 직접 메모리영역으로 접근해서 변경이 불가하다는 말.
만약에 재할당을 했을 새로운 메모리영역에 값을 저장하고 그 주소에 있는 값을 가리키게 된다.

참조값

참조값은 데이터를 heap 메모리에 저장하며, 배열, 객체 등이 있다.
참조값은 배열이나 객체를 heap 메모리에 저장하고 그 메모리주소를 변수에 저장한다.
참조값은 참조를 통해 메모리에 접근하여 직접 데이터를 변경한다. (mutable)

** 참조값을 함수로 넘기면 참조값이 복사 되어서 넘어간다.(call by value) 만약에 함수 내에서 참조 매개변수를 재할당하면 함수 내에서는 매개변수가 그 재할당한 변수가 되지만, 실제 참조값에는 영향이 없다.

function func(b) {
  b.name = 'steve'
  b = 1
  console.log(b) // 1
}
let a = {};
func(a)
console.log(a) // {name: 'steve'}

https://perfectacle.github.io/2017/10/30/js-014-call-by-value-vs-call-by-reference/

mutablilty, immutablilty
https://poiemaweb.com/js-immutability

정적 타입(static type) 언어 vs 동적 타입(dynamic type) 언어

정적 타입 언어

변수를 선언할 때 데이터 타입을 미리 선언하는 언어. 한번 정해진 타입은 변경불가.
C, C++, Java

동적 타입 언어

타입을 선언하지 않는 언어. 값이 변수에 할당 될 때 그 값에 맞게 타입이 정해진다(타입 추론).
재할당의 의해 변수의 타입이 동적으로 변경됨.
JS, Python.

명시적 타입 변환 vs 암묵적 타입 변환

  • 명시적 타입 변환: 의도적으로 다른 타입으로 변환하는 것 = 타입 캐스팅
  • 암묵적 타입 변환 - 개발자의 의도와 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환되는 것.

명시적 타입 변환의 예시
1. 문자열이 아닌 값을 문자열로 변환

// 1. String 생성자 함수를 new 연산자 없이 호출하는 방법
String(1); // -> "1"

// 2. Object.prototype.toString 메서드를 사용하는 방법
(1).toString(); // -> "1"

// 3. 문자열 연결 연산자를 이용하는 방법
1 + ""; // -> "1"
  1. 숫자 타입이 아닌 값을 숫자 타입으로 변환
// 1. Number 생성자 함수를 new 연산자 없이 호출하는 방법
Number("0"); // -> 0

// 2. parseInt, parseFloat 함수를 사용하는 방법(문자열만 변환 가능)
parseInt("0"); // -> 0

// 3. + 단항 산술 연산자를 이용하는 방법
+"0"; // -> 0

// 4. * 산술 연산자를 이용하는 방법
"0" * 1; // -> 0
  1. 불리언 타입이 아닌 값을 불리언 타입으로 변환하는 방법
  • Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
  • ! 부정 논리 연산자를 두번 사용하는 방법

Truthy/Falsy 한 값

Truthy 값은 참으로 평가되는 값이고 Falsy 한 값은 거짓으로 평가되는 값이다. 조건문 등에서 true/false 로 암묵적 변환된다.
Falsy 값 : false, undefined, null, 0, NaN, ''(빈 문자열)

profile
게임과 프론트엔드에 관심이 많습니다.

0개의 댓글