모던 자바스크립트 Deep Dive 21장-빌트인 객체

HustleKang·2022년 4월 11일

자바스크립트 객체의 분류

  • 표준 빌트인 객체
    - ECMAScript 사양에 정의된 객체
    - 전역 객체의 프로퍼티로 제공됨
    - 전역 변수처럼 선언 없이 언제나 참조 가능
  • 호스트 객체
    - 브라우저,Node.js 에서 추가로 제공되는 객체
  • 사용자 정의 객체
    - 사용자가 정의한 객체

표준 빌트인 객체

Object,String,Number,Boolean,Symbol,Date,Math ...등등
Math,Reflect,JSON을 제외한 모든 빌트인 객체는 인스턴스를 생성할 수 있는 생성자 함수 객체이다.
표준 빌트인 객체가 생성한 인스턴스의 프로토타입은 해당 빌트인 객체의 prototype프로퍼티에 바인딩된 객체이므로, 다양한 프로토타입 메서드를 상속받아 사용 가능
표준 빌트인 객체는 정적 메서드도 있다, 인스턴스 없이 호출 가능

원시값과 래퍼 객체

문자열, 숫자, 불리언 값에 객체처럼 접근을 하면 임시적으로 생성되는 객체

const str = 'hello';

// 문자열에 .length로 객체처럼 접근하게 되면 String 생성자 함수의 인스턴스가 생성되고
// 문자열 값은 그 래퍼객체의 [[StringData]] 내부 슬롯에 할당
console.log(str.length); // 5 
console.log(str.toUpperCase()); // HELLO

console.log(typeof str); // 원시값 그대로 돌아오고 래퍼객체는 가비지 컬렉션의 대상
const str = 'John';
str.age = 20; //래퍼 객체가 생성되고 해당 객체에 age라는 프로퍼티 동적 할당

//str은 본래 원시값으로 돌아가고 생성된 래퍼 객체는 가비지 컬렉션의 대상

//객체처럼 접근했으니 또 새로운 래퍼 객체가 생성된다
// 해당 객체에 name이라는 프로퍼티는 없으니 undefined
console.log(str.name); //undefined

// 또다시 원시값으로 돌아가고 방금 생성된 래퍼 객체는 가비지 컬렉션의 대상

String,Number,Boolean 생성자 함수를 new와 함께 호출하여 인스턴스를 생성할 필요가 없다
래퍼객체가 일시적으로 생겨서 필요한 프로퍼티를 참조할 수 있기 때문에
null과 undefined는 래퍼 객체가 생성되지 않음

전역 객체

런타임 이전에 가장 먼저 생성되는 최상위 객체
브라우저에서는 window, node.js에서는 global
globalThis : 실행 환경 상관없이 전역객체를 가르킴, ES11

전역 객체의 프로퍼티 :

  • 표준 빌트인 객체
  • 호스트 객체
  • var키워드로 선언한 전역 변수
  • 전역 함수

전역 객체의 프로퍼티는 참조할 때 window,global 생략 가능
let과 const로 선언한 전역변수는 전역객체의 프로퍼티가 아니다

빌트인 전역 프로퍼티

Infinity

Infinity를 값으로 갖는다

NaN

NaN을 값으로 갖는다

undefined

undefined를 값으로 갖는다

빌트인 전역 함수

eval

인수로 받은 문자열을 자바스크립트 코드로 실행
eval은 사용을 금지

isFinite

유한수 true, 무한수 false
인수의 타입이 숫자가 아니면 숫자로 타입 변환 후 판단
NaN으로 판단되면 false

isNaN

인수의 타입이 숫자가 아니면 숫자로 타입 변환 후 판단

parseFloat

문자열 인수를 실수로 해석해 반환

// 공백으로 구분된 문자열은 맨 앞에만
parseFloat('1 2 3'); //1
parseFloat('1 day'); //1

// 맨앞이 숫자로 변환불가시
parseFloat('before 2 days'); // NaN

// 앞,뒤 공백은 무시됨
parseFloat('   1  '); //1

parseInt

문자열 인수를 정수로 해석해 반환
parseInt(문자열,진법);
문자열을 진법으로 해석한 결과를 10진수로 반환
진법 생략하면 문자열을 10진수로 해석해서 10진수로 반환
but 문자열이 0x,0X로 시작하면 16진수로 해석되어 10진수로 반환

첫번째 인수로 전달된 문자열이 두번째 인수인 진법으로 해석입 불가하면 NaN

parseInt('2',2); /NaN 2진법에 2는 없음

인수로 받은 문자열의 중간부터 해당 진법으로 해석이 불가하면 직전에 해석된 곳까지 반환

parseInt('1012110',2); // 101까지 2진법으로 해석하면 5, 뒤는 무시

parseFloat이랑 똑같이
공백으로 구분된 문자열은 맨 앞에만
맨앞이 숫자로 변환 불가시 NaN
앞,뒤 공백 무시

encodeURI / decodeURI

인수로 전달받은 URI 문자들을 이스케이프 처리한다
이스케이프 처리 : 문자를 아스키 문자 셋으로 변경
URI는 아스키 문자 셋으로만 구성되어야 한다

encodeURIComponent / decodeURIComponent

쿼리 스트링 문자인 =,?,& 도 인코딩한다
encodeURI는 완전한 URI로 인식하기 때문에 쿼리 스트링은 제외하고 인코딩함

암묵적 전역

암묵적 전역은 전역 객체의 프로퍼티이지 변수가 아니다
따라서 변수 호이스팅이 발생하지 않는다
전역 변수는 delete연산자로 삭제 불가능
암묵적 전역은 전역 객체의 프로퍼티이므로 delete로 삭제 가능

console.log(x); // undefined 변수 호이스팅
console.log(y); // ReferenceError

var x = 10;

function f(){
	y =20;
}

f();

console.log(x+y); // 30 

delete x; // 삭제 불가
delete y; //  전역변수가 아니라 프로퍼티 이므로 삭제 가능

이웅모, 『모던 자바스크립트 Deep Dive』, 위키북스(2021)

profile
grindin'

0개의 댓글