fffo

빌트인 객체 본문

Programming/Javascript

빌트인 객체

gggs 2021. 10. 5. 19:26

빌트인 객체

js 객체의 분류

  • js 객체는 크게 3개로 분류할 수 있음
    • 표준 빌트인 객체(standard built-in / native / global objects)
      • ECMAScript 사양에 정의된 객체
    • 호스트 객체(host objects)
      • ECMAScript 사양에 정의되어 있지 않지만 js 실행환경(브라우저 환경 또는 node.js환경)에서 추가로 제공하는 객체
    • 사용자 정의 객체(user-defined objects)
      • 사용자가 직접 정의한 객체

표준 빌트인 객체

  • Math, Reflect, JSON을 제외한 모든 표준 빌트인 객체는 생성자 함수 객체이고 프로토타입 메서드와 정적 메서드를 제공함
  • 생성자 함수가 아닌 표준 빌트인 객체는 정적 메서드만 제공함
const numObj = new Number(1.5);

// toFixed : 소수점 자리를 반올림하여 문자열로 반환하는 Number.prototype의 메서드 
console.log(numObj.toFixed()); // 2

// isInteger : 인수가 정수인지 검사하여 boolean 값 반환하는 Number의 정적 메서드
console.log(Number.isInteger(numObj)); // false

// console.log(numObj.isInteger(1.5)); // TypeError: numObj.isInteger is not a function

원시값과 래퍼 객체

  • 원시값을 객체처럼 접근하면 js엔진이 암묵적으로 연관된 객체를 생성해 생성된 객체로 프로퍼티에 접근하거나 메서드를 호출하고 다시 원시값으로 되돌림
  • 원시값에 대해 객체처럼 접근하면 생성되는 임시 객체를 래퍼 객체(wrapper object)라고 함
  • 기존의 원시값은 내부 슬롯(문자열을 예로 들면 [[StringData]])에 할당됨
  • 래퍼 객체의 처리가 종료되면 래퍼객체의 내부 슬롯에 할당된 원시값으로 식별자를 되돌리고 래퍼 객체는 가비지 컬랙션의 대상이 됨
  • 문자열, 숫자, 불리언, 심벌 이외의 원시값(null, undefined)은 래퍼 객체를 생성하지 않음

전역 객체

  • 전역 객체 : 코드 실행 이전에 js엔진에 의해 어떤 객체보다도 가장 먼저 생성되는 특수 객체, 어떤 객체에도 속하지 않는 최상위 객체
  • 환경에 따라 이름이 달라짐
    • 브라우저 : window(self, this, frames)
    • Node.js : global
  • ES11에서 도입된 globalTHis는 각 환경의 전역변수를 가리키는 다양한 식별자를 통일한 것
  • 전역 객체는 표준 빌트인 객체, 호스트 객체, var로 선언한 전역 변수와 전역 함수를 프로퍼티로 가짐
  • 전역 객체의 프로퍼티를 참조할 때 전역 객체를 가리키는 식별자를 생략할 수 있음

빌트인 전역 프로퍼티

  • Infinity : 무한대를 나타내는 숫자 값 Infinity를 가진 프로퍼티
  • NaN : 숫자가 아닌 값을 나타내는 숫자 값 NaN를 가진 프로퍼티
    • Number.NaN 프로퍼티와 동일함
  • undefined : 원시 타입 undefined를 값으로 갖는 프로퍼티
console.log(window.Infinity === Infinity); // true
console.log(window.NaN); // NaN
console.log(window.undefined === undefined); // true

빌트인 전역 함수

  • eval : js 코드를 나타내는 문자열을 인수로 받음. 문자열 코드가 표현식이면 런타임에 평가하여 값을 생성, 표현식이 아닌 문이면 런타임에 실행함.
    • 여러 개의 문으로 이루어져 있으면 모든 문을 실행
    • eval 함수를 통해 사용자로부터 입력받은 콘텐츠를 실행하는 것은 보안에 매우 취약할 뿐더러 eval함수를 통해 실행되는 코드는 js엔진에 의해 최적화가 수행되지 않으므로 처리속도가 느림 → eval함수 지양
  • isFinite : 전달받은 인수를 숫자 타입으로 변환 후 유한수이면 true, 무한수이거나 NaN이면 false 반환
  • isNaN : 전달 받은 인수를 숫자 타입으로 변환 후 NaN이면 true, 아니면 false 반환
  • parseFloat : 전달받은 문자열 인수를 부동 소수점 숫자로 해석해 반환
    • 공백으로 구분된 문자열은 첫 번째 문자열만 반환
    • 첫 번째 문자열을 숫자로 변환할 수 없으면 NaN 반환
    • 앞 뒤 공백 무시
  • parseInt : 전달받은 문자열 인수를 정수로 해석해 반환
    • 두 번째 인수로 진법을 나타내는 기수를 전달할 수 있음. 반환 값은 항상 10진수
    • 문자열을 순차 탐색하며 해석할 수 없는 수가 나온 문자와 그 이후는 전부 무시됨
    • 첫 번째 문자열을 숫자로 변환할 수 없으면 NaN 반환
    • 앞 뒤 공백 무시
parseInt('10'); // 10
parseInt('10.123'); // 10

// 11을 2진수로 해석하고 그 결과를 10진수로 반환
parseInt('11',2); // 3

// 11을 16진수로 해석하고 그 결과를 16진수로 반환
parseInt('11',16); // 17

// 2진수에서 '2'는 해석될 수 없음
parseInt('20', 2); // NaN

// 해석할 수 없는 수 이후 문자들은 무시됨
parseInt('1A0', 10); // 1
  • encodeURI / decodeURI
    • URI : 인터넷에 있는 자원을 나타내는 유일한 주소
    • encodeURI : 완전한 URI를 문자열로 전달받아 이스케이프 처리를 위해 인코딩함
    • 이스케이프 처리 : 네트워크를 통해 정보를 공유할 때 어떤 시스템에서도 읽을 수 있는 아스키 문자 셋으로 변환하는 것
    • decodeURI은 반대로 디코딩시켜줌
  • encodeURIComponent / decodeURIComponent
    • URI 구성 요소(component)를 인수로 전달받아 인코딩(이스케이프 처리)함
    • encodeURI와의 차이점 : 본 함수는 인수로 전달된 문자열을 쿼리 스트링의 일부로 간주해 쿼리 스트링 구분자로 사용되는 =,?, &까지 인코딩하지만 encodeURI는 인수를 완전한 URI전체로 간주해 해당 구분자들을 인코딩하지 않음

암묵적 전역

  • 선언되지 않은 식별자에 값을 할당 시 js엔진은 전역 객체에 프로퍼티를 동적으로 생성함
// y는 선언된 적 없음
y = 20; // window.y = 20; 으로 해석되어 전역 객체에 프로퍼티를 동적으로 생성해 할당
  • 이는 변수 선언이 아닌 객체의 프로퍼티로의 추가이기 때문에 변수 호이스팅이 발생하지 않음
// console.log(y); // ReferenceError
y = 20;
console.log(y); // 20
  • var로 선언된 전역변수는 delete로 삭제할 수 없지만 암묵적 전역으로 선언된 프로퍼티는 delete로삭제 가능
var x = 10;
y = 20;

console.log(window.x); // 10
console.log(window.y); // 20

delete x;
delete y; 

console.log(window.x); // 10
console.log(window.y); // undefined

'Programming > Javascript' 카테고리의 다른 글

실행 컨텍스트  (0) 2021.10.07
this  (0) 2021.10.06
strict mode  (0) 2021.10.04
프로토타입  (0) 2021.10.03
함수의 일급 객체  (0) 2021.10.02
Comments