JavaScript 자료형과 특성 (221118) - TIL7

Pablaw·2022년 11월 18일
0

TIL

목록 보기
7/20
post-thumbnail

JavaScript 자료형과 특성

1. 느슨한 타입(loosely typed)의 동적(dynamic)언어

  • 자바스크립트의 변수는 특정 자료형으로 고정되는 것이 아니라 모든 자료형의 값으로 할당 및 재할당이 가능하다.
<script>
	let foo = 42 // foo가 숫자
    foo = 'bar' // foo가 이제 문자열
    foo = true // foo가 이제 불리언
</script>

2. JavaScript 형변환

  • 자바스크립트의 변수는 선언된 이후에 다양한 형태로 자료형을 변경할 수 있다.
<script>
	let foo;
    console.log(typeof foo); // foo의 자료형은 undefined
    foo = null;
    console.log(typeof foo); // foo의 자료형은 object 
*null의 경우 원시 자료형이지만 '원시적'이지 않은 값을 지닌다. 
위의 경우를 모든 object가 null 값에서 파생된다고 말하기도 하고 
버그라고 말하기도 한다.
    foo = 1;
    console.log(typeof foo); // foo의 자료형은 숫자
    foo = '1';
    console.log(typeof foo); // foo의 자료형은 문자
    foo = true;
    console.log(typeof foo); // foo의 자료형은 불리언
</script>

3. ==, === 비교연산자의 차이

==의 경우는 비교되는 대상간의 값을 비교하지만 자료형의 일치 여부까지는 고려하지 않는다.

반면 === 비교연산자의 경우 자료형까지 모두 일치해야 true값을 리턴한다.

<script>
	console.log(1 == '1'); // true
	console.log(1 === '1'); // false
</script>

4. 느슨한 타입(loosely typed)의 동적(dynamic) 언어의 문제점은 무엇이고 보완할 수 있는 방법

느슨한 타입의 동적 언어라는 특징을 지니는 자바스크립트는 조건문에서 분기가 필요한 경우 자료형을 고려한 코드의 작성이 필요하다.

이와 관련해서 실제로 겪었던 문제는 db에 있는 데이터를 호출할 때 jsonify형태로 값이 전달되는데 이 때는 숫자 데이터도 문자열로 값을 받게 된다.

이를 고려하지 않고 단순히 숫자로 비교 연산자를 이용한 조건문을 사용할 경우 오류가 발생하게 된다.
비교연산자를 사용하는 경우 ===의 사용이 권장되고 이를 통해 엄격한 비교가 가능해진다.

5. undefined와 null의 차이

  • 널(null)형

    널(null)형은 null 하나의 값만 가질 수 있다.

    null 값은 일반적으로 존재하지 않거나 유효하지 않은 객체 또는 주소를 의도적으로 가리키는 참조 값이다.
<script>
	typeof null === 'object' // true
</script>

typeof null의 경우 object를 반환하는데 이러한 경우에는 '원시적'이지 않다고도 할 수 있다.
(null형의 자료형은 null이어야 하지만 object로 반환)

위의 경우를 모든 object가 null 값으로 파생된다고 말하기도 하고 버그라고 말하기도 한다.

  • undefined형

    값이 할당되지 않은 변수는 undefined 상태다.
    (선언 자체가 안된 변수는 정의되지 않은 undefined 에러가 나오지만 해당 변수의 값이 아닌 에러명이다.)
<script>
	let x;
    console.log(x); // undefined
</script>

undefined은 변수를 선언하고 값을 할당하지 않은 상태이며 자료형이 없는 상태이다.

null의 경우는 변수를 선언하고 빈 값을 할당한 상태이며 자료형은 object이다.

profile
반갑습니다, 프론트엔드 개발자를 꿈꾸고 있습니다 ! https://pablaw.github.io/profileLink/

0개의 댓글