모던 자바스크립트 Deep Dive - 21.빌트인 객체 / 수업내용 추가 정리

지영·2022년 1월 9일
0

JavaScript

목록 보기
22/37
post-thumbnail

빌트인 객체


21.1 자바스크립트 객체의 분류

❗️ 자바스크립트 객체는 다음과 같이 크게 3개의 객체로 분류할 수 있다.

  • 표준 빌트인 객체

    표준 빌트인 객체는 ECMAScript 사양에 정의된 객체를 말하며, 애플리케이션 전역의 공통 기능을 제공한다.
    자바스크립트 실행 환경과 관계 없이 언제나 사용할 수 있다.
    표준 빌트인 객체는 전역 객체의 프로퍼티로서 제공된다.
  • 호스트 객체

    자바스크립트 실행 환경 (브라우저 환경 또는 Node.js 환경) 에서 추가로 제공하는 객체를 말한다.
  • 사용자 정의 객체

    사용자가 직접 정의한 객체를 말한다.

21.2 표준 빌트인 객체

  • 자바스크립트는 40여 개의 표준 빌트인 객체를 제공한다.
  • Math, Reflect, JSON 을 제외한 표준 빌트인 객체는 모두 인스턴스를 생성할 수 있는 생성자 함수 객체다.
  • 생성자 함수 객체인 표준 빌트인 객체프로토타입 메서드정적 메서드를 제공하고 생성자 함수 객체가 아닌 표준 빌트인 객체는 정적 메서드만 제공한다.
  • 예를 들어 표준 빌트인 객체인 String, Number, Boolean, Function, Array, Date는 생성자 함수로 호출하여 인스턴스를 생성할 수 있다.
  • 생성자 함수인 표준 빌트인 객체가 생성한 인스턴스의 프로토타입은 표준 빌트인 객체의 prototype 프로퍼티에 바인딩된 객체이다.

21.3 원시값과 래퍼 객체

  • 문자열이나 숫자, 불리언 등의 원시값이 있는데도 문자열, 숫자, 불리언 객체를 생성하는 String, Number, Boolean등의 빌트인 생성자 함수가 존재하는 이유는 무엇일까?
  • 원시값은 객체가 아니므로 프로퍼티나 메서드를 가질 수 없는데도 원시값인 문자열이 마치 객체처럼 동작한다.
  • 원시값에 대해 마치 객체처럼 마침표 표기법(또는 대괄호 표기법)으로 접근하면 자바스크립트 엔진이 일시적으로 원시값을 연관된 객체로 변환해 주기 때문이다.
  • 문자열, 숫자, 불리언 값에 대해 객체처럼 접근하면 생성되는 임시 객체를 레퍼 객체(wrpper object)라고 한다.
  • 문자열 래퍼 객체인 String생성자 함수의 인스턴스는 String.prototype의 메서드를 상속받아 사용할 수 있다.
  • 래퍼 객체의 처리가 종료되면 래퍼 객체의 [[ ]] 내부 슬롯에 할당된 원시값으로 원래의 상태, 즉 식별자가 원시값을 갖도록 되돌리고 래퍼 객체는 가비지 컬렉션의 대상이 된다.
  • 식별자가 원시값을 되돌리고 래퍼 객체는 가비지 컬랙션의 대상이 된다.
  • 문자열, 숫자, 불리언, 심벌은 암묵적으로 생성되는 래퍼 객체에 의해 마치 객체처럼 사용할 수 있으며, 표준 빌트인 객체인 String, Number, Boolean, Symbol의 프로토타입 메서드 또는 프로퍼티를 참조할 수 있다.
  • null과 undefined는 래퍼객체를 생성하지 않는다.

21.4 전역 객체

  • 전역 객체(global object)는 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체이며, 어떤 객체에도 속하지 않는 최상위 객체이다.

    ❗️GlobalThis
    ES11(EEMAScript 11)에서 도입된 globalThis는 브라우저 환경과 Node.js 환경에서 전역 객체를 가리키던 다양한 식별자를 통일한 식별자이다.

  • 전역 객체는 표준 빌트인 객체와 환경에 따른 호스트 객체, var 키워드로 선언한 전역 변수와 전역 함수를 프로퍼티로 갖는다.

  • 전역 객체의 프로퍼티를 참조할 때 window(또는 global)를 생략할 수 있다.

  • let, const키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다.

  • let, const키워드로 선언한 전역 변수는 보이지 않는 개념적인 블록(전역 렉시컬 환경의 선언적 환경 레코드) 내에 존재하게 된다.

  • 브라우저 환경의 모든 자바스크립트 코드는 하나의 전역 객체 window를 공유한다. 이는 분리되어 있는 자바스크립트 코드가 하나의 전역을 공유한다는 의미이다.


24.4.1 빌트인 전역 프로퍼티

  • 빌트인 전역 프로퍼티전역 객체의 프로퍼티를 의미한다. 주로 애플리케이션 전역에서 사용하는 값을 제공한다.

Infinity

  • Infinity프로퍼티는 무한대를 나타내는 숫자값 Infinity를 갖는다.

NaN

  • NaN프로퍼티는 숫자가 아님(Not-a-Number)을 나타내는 숫자값 NaN을 갖는다.

undefined

  • undefined프로퍼티는 원시 타입 undefined를 값으로 갖는다.

24.4.2 빌트인 전역 함수

  • 빌트인 전역 함수는 애플리케이션 전역에서 호출할 수 있는 빌트인 함수로서 전역 객체의 메서드이다.

eval

  • eval 함수의 사용은 금지해야 한다. (이 정도만 알고 넘어가자 👀)

isFinite

  • 전달받은 인수가 정상적인 유한수인지 검사하여 유한수면 true를 반환하고, 무한수이면 false를 반환한다.
  • 전달 받은 인수가 숫자 타입이 아닌 경우 숫자로 타입을 변환 후 검사를 수행한다.
  • 인수가 NaN으로 평가되는 값이라면 false를 반환한다.
  • null은 숫자 타입으로 반환되면 0이 된다! -> falsy 한 값!!

isNaN

  • 전달받은 인수가 NaN인지 검사하여 그 결과를 불리언 타입으로 반환한다.
  • 전달받은 인수의 타입이 숫자가 아닐 경우 숫자로 타입을 변환한 후 검사를 수행한다.
  • undefinedNaN이다. -> isNaN의 인수로 입력시 true 를 리턴한다!

parseFloat

  • 전달받은 문자열 인수를 부동 소수점 숫자, 즉 실수로 해석하여 반환한다.
  • 공백으로 구분된 문자열은 첫 번째 문자열만 변환한다.
  • 첫 번째 문자열을 숫자로 변환할 수 없다면 NaN을 반환한다.
  • 앞 뒤 공백은 무시된다.

parseInt

  • 전달받은 문자열 인수를 정수로 해석하여 반환한다.
  • 전달받는 인수가 문자열이 아니라면 문자열로 변환한 다음, 정수로 해석하여 반환한다.
  • 두번째 인수로 진법을 나타내는 기수(2~36)를 전달할 수 있다.
  • 기수를 지정하면 첫번째 인자로 전달된 문자열을 해당 기수의 숫자로 해석하여 반환한다. 이 때 반환값은 언제나 10진수이다! 기수를 생략하면 첫번째 인자로 전달된 문자열을 10진수로 해석하여 반환한다.
  • 첫 번째 인수로 전달된 문자열이 '0x' 또는 '0X'로 시작하는 16진수 리터럴이면 자동으로 16진수로 해석하여 10진수 정수로 반환한다.
  • 2진수 리터럴 8진수 리터럴은 제대로 해석하지 못한다.
  • ES6부터는 '0'으로 시작하는 숫자를 8진수로 해석하지 않고 10진수로 해석한다. 따라서 문자열을 8진수로 해석하려면 지수를 반드시 지정해야 한다.
  • 첫 번째 인수로 전달한 문자열의 첫 번째 문자가 해당 지수의 숫자로 변환될 수 없다면 NaN을 반환한다.
  • 첫 번째 인수로 전달한 문자열의 두 번째 문자부터 해당 진수를 나타내는 숫자가 아닌 문자와 마주치면 이 문자와 계속되는 문자들은 전부 무시되며 해석된 정수값만 반환한다.
  • 첫 번째 인수로 전달한 문자열에 공백이 있다면 첫 번째 문자열만 해석하여 반환하며 앞 뒤 공백은 무시한다. 첫 번째 문자열을 숫자로 해석할 수 없는 경우 NaN을 반환한다.
  • 참고로 기수를 지정하여 10진수 숫자를 해당 기수의 문자열로 변환하여 반환하고 싶을 때는 Number.prototype.toString 메서드를 사용한다.
    toString 메서드의 인자로 기수를 전달하여 그 기수의 문자열로 반환한다.

encodeURI

  • encodeURI 함수는 완전한 URI를 문자열로 전달받아 이스케이프 처리를 위해 인코딩한다.
  • URI는 인터넷에 있는 자원을 나타내는 유일한 주소를 말한다.
  • URI의 하위개념으로 URI, URN이 있다.

    인코딩이란 URI의 문자들을 이스케이프 처리하는 것을 의미한다.
    이스케이프 처리는 네트워크를 통해 정보를 공유할 때 어떤 시스템에서도 읽을 수 있는 아스키 문자 셋으로 변환하는 것이다.

  • URI 는 아스키 문자 셋으로만 구성되어야 하며 한글을 포함한 대부분의 외국어나 아스키 문자 셋에 정의되지 않은 특수 문자의 경우 URL에 포함될 수 없다.
  • 따라서 URL 내에서 의미를 갖고 있는 문자 %,?,#나 URL에 올 수 없는 문자 한글, 공백 등 또는 시스템에 의해 해석될 수 있는 문자 <,>를 이스케이프 처리하여 야기될 수 있는 문제를 예방하기 위해 이스케이프 처리가 필요하다.
  • 알파벳, 0~9의 숫자, -, _, ., !, ~, *, ', (, ) 문자는 이스케이프 처리에서 제외된다.

decodeURI

  • decodeURI 함수는 인코딩된 URI를 인수로 전달받아 이스케이프 처리 이전으로 디코딩한다.

encodeURIComponent / decodeURIComponent

  • encodeURIComponent 함수는 URI 구성 요소를 인수로 전달받아 인코딩한다.
  • 인코딩이란 URI의 문자들을 이스케이프 처리하는 것을 의미한다.
  • 알파벳, 0~9의 숫자, -, _, ., !, ~, *, ', (, ) 문자는 이스케이프 처리에서 제외된다.
  • decodeURIComponent 함수는 매개변수로 전달된 URI 구성 요소를 디코딩한다.
  • encodeURIComponent 함수는 인수로 전달된 문자열을 URI의 구성요소인 쿼리 스트링의 일부로 간주한다.
  • 쿼리 스트링 구분자로 사용되는 =, ?, &까지 인코딩한다.
  • encodeURI 함수는 매개변수로 전달된 문자열을 완전한 URI 전체라고 간주한다. 따라서 쿼리 스트링 구분자로 사용되는 =, ?, & 은 인코딩하지 않는다.

21.4.3 암묵적 전역

  • 선언하지 않은 식별자는 마치 선언된 전역 변수처럼 동작한다.
  • 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티가 되기 때문이다.
  • 이러한 현상을 암묵적 전역이라 한다.
  • 하지만 이렇게 전역 객체에 할당된 프로퍼티는 단지 전역 객체의 프로퍼티로 추가되었을 뿐, 변수는 아니다.
  • 암묵적 전역으로 전역 객체에 할당된 프로퍼티는 변수가 아니므로 변수 호이스팅이 발생하지 않는다!!
  • 또한 변수가 아니라 단지 프로퍼티이므로 delete 연산자로 삭제할 수 있다. 만약 전역 변수라면 delete 연산자로 삭제할 수 없다.
profile
천천히 운영되는 개발 블로그

0개의 댓글