TIR: 완벽가이드 1. 코어자바스크립트(2) 타입, 값 - 220614

Lumpen·2022년 6월 14일
0

TIR

목록 보기
4/40

날짜와 시간

날짜와 시간을 표현하는 Date() 객체 생성자를 제공
Date 객체는 원시 타입이 아니다

텍스트

문자열은 16비트 값들이 연속적으로 나열된 변경 불가능한 값
유니코드 문자로 표현된다
문자열의 길이는 16비트 값의 개수다
0 기반의 인덱싱 사용
문자 하나를 표현하는 타입이 없으므로 길이가 1인 문자열 사용

문자열 리터럴

큰 따옴표, 작은 따옴표
ES3에서는 문자열 리터럴은 한줄로만 작성해야 했지만
ES5 부터 역슬래시()를 통해 한 줄을 여러 줄로 작성할 수 있다
어포스트로피를 문자열에 포함시길 때도 역슬래시 사용

문자열은 '+' 더하기를 사용하여 이어 붙일 수 있다
길이는 .length

패턴 매칭

자바스크립트는 문자 패턴을 나타내는 객체를 생성하기 위해 RegExp() 생성자를 정의한다
정규 표현식이라고 부르며 정규표현식을 위해 펄(Perl) 구문을 따른다
문자열과 RegExp 객체는 모두 패턴 매칭과 검색 후 바꾸기 기능을 수행하는 메서드를 가지고있다

boolean

참/거짓

falsy한 값 - false와 같은 값

undefined
null
0
-0
NaN
'' // 빈 문자열

이외의 모든 값은 true로 변환되고 동작한다

불리언 값은 문자열로 변환할 수 있는 toString() 메소드를 가지고있다

null과 undefined

null은 아무 값도 가지지 않음을 뜻하며, 특별한 값을 평가한다
typeof null 은 'object'로 null이란 객체가 없음을 뜻하는 특별한 객체로 생각할 수 있다
null은 어떤 고유한 자료형에 속한 것으로 간주된다

undefined는 null보다 심한 부재 상태를 나타낸다
초기화 되어있지 않은 변수나, 존재하지 않는 객체 프로퍼티, 배열의 원소 값에 접근하려고 할 때 얻는 값이다
또한 반한 값이 없는 함수의 반한 값이고, 실 인자가 전달되지 않은 형식 인자의 값이다

undefined는 미리 선언된 전역 변수이며 (null은 언어 차원의 키워드) 정의 되지 않은 값으로 초기화 된다

ES3 에서는 읽고 쓰기 가능한 변수였지만
ES5 부터는 읽기 전용이 되었다
typeof undefined는 'undefined'로 특별한 고유 값이다

차이는 분명히 있지만 null과 undefined 모두 값이 없음을 가리키고 서로 바꿔서 사용할 수도 있다
null과 undefined는 엄격한 동치 연산자 '===' 를 사용하지 않으면 같은 값으로 판별한다

null과 undefined는 프로퍼티와 메소드를 가지고 있지 않기 때문에 .연산자나 []를 이용해 접근하게 되면 TypeError가 발생한다

예기치 않은 상황에 대한 오류성 부재를 표현할 때는 undefined
일반적으로 예상 가능한 부재 상황은 null을 사용한다

프로퍼티에 할당하거나 함수 인자로 전달한다면 null이 적절하다

전역 객체

전역 객체는 매우 중요한 용도로 사용되는 일반 객체다
자바스크립트 인터프리터가 시작할 때, 새로운 페이지를 불러올 때, 새로운 전역 객체를 만들고 프로퍼티를 초기화 한다

  • undefined, Infinity, NaN 등의 전역 프로퍼티
  • isNaN(), parseInt() 등 전역 함수
  • Date(), RegExp() 등 생성자 함수
  • Math, JSON 등 전역 객체

undefined, Infinity, NaN 등의 전역 프로퍼티는 예약어가 아니지만 예약어처럼 취급 된다

최상위 코드에서는 this 키워드를 통해 전역 객체를 참조할 수 있다

var global = this;

클라이언트 측 자바스크립트에서 Window 객체는 브라우저 창에 포함된 모든 자바스크립트 코드를 위한 전역 객체다
Window 객체는 자기 자신을 참조하는 window 프로퍼티를 가지고 있는데 전역 객체를 참조할 때 사용할 수 있다
전역 변수를 선언한다면 전역 객체의 프로퍼티가 되는 것이다

Wrapper 객체

자바스크립트의 객체는 복합적인 값이다
프로퍼티 또는 이름있는 값들의 집합이며 . 표기법을 사용하여 프로퍼티의 값을 참조한다
프로퍼티의 값이 함수이면 메소드라고 부른다

문자열은 객체가 아닌데 왜 프로퍼티를 가지고 있을까

문자열 's'의 프로퍼티를 참조하려고 할 때, 자바스크립트는
new String(s)를 호출한 것처럼 문자열 값을 객체로 변환한다
이 객체는 문자열 메소드를 상속하며 프로퍼티 참조를 살펴보는 데 사용된다
프로퍼티 참조가 해제되면 새로 생성된 임시 객체는 메모리에서 회수된다

숫자와 불리언도 문자열과 같은 이유로 메소드를 가지고 있다
임시 객체는 Number(), Boolean() 생성자를 통해 만들어지고, 메소드는 임시 객체를 통해 호출된다

null과 undefined의 래퍼 객체는 없기 때문에
프로퍼티 접근 시 TypeError가 나는 것이다

const s = 'test'
s.len = 4
const t = s.len

이 경우 t의 값은 undefined이다
String 객체에 len을 할당하면 임시 객체에 할당 되고
바로 삭제된다
여기서 임시 객체는 wrapper 객체로 알려져 있다
wrapper 객체는 프로퍼티를 할당할 수 없다는 점에서 일반 객체와 다르다

String(), Number(), Boolean 생성자를 이용해 명시적으로 래퍼 객체를 생성할 수 있지만 쓸 일 없다

변경 불가능한 원시 타입 값과 변경 가능한 객체 참조

원시 타입은 수정할 수 없다
숫자와 불리언의 경우는 명확하지만 문자열은 수정 가능한 것처럼 보인다
하지만 모든 문자열 메소드는 문자열을 수정하는 것이 아니라 새로운 문자열을 반환하는 것이다

문자열은 값으로만 비교되는 원시 타입과 다르게 서로 다른 문자열 값을 비교할 때 문자열의 길이와 각 인덱스 문자를 비교한다

객체는 자신의 값을 변경할 수 있다
객체는 값으로 비교되지 않아, 같은 값을 가져도 다른 객체로 판별한다
객체는 참조 타입으로 참조하고 있는 주소 값을 비교한다
같은 객체를 참조하면 같다고 판별

타입 변환

자바스크립트는 타입에 대해 매우 유연하다

'javascript' +  1 // 'javascript1'
'7' * '4' // 28
const n = 1 - 'x' // NaN
n + ' obj' // 'NaN obj'

원시 타입 간의 변환은 간단하다
문자열로의 변환은 모든 원시타입에 대해 잘 정의되어 있다
숫자로의 변환은 조금 까다롭다
앞 뒤 공백은 허용하지만 공백이나 숫자가 아닌 문자가 있으면
NaN으로 반환된다
true 는 1로 변환되고 falsy한 값은 0으로 변호나된다

객체로의 변환은 String(), Number() 생성자를 호출함으로 래퍼 객체로 변환할 수 있다

null과 undefined는 변환할 수 없다

객체애서 원시타입으로의 변환은 복잡하다

변환과 동치

동등 연산자 '=='를 사용하면 자동변환
엄격한 동치 연산자 '==='를 사용하면 변환을 하지 않는다

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글