JS DeepDive 21장 빌트인 객체

한칙촉·2024년 4월 21일

자바스크립트 객체의 분류

  • 표준 빌트인 객체 = ECMAScript 사양에 정의된 객체
  • 호스트 객체 = 자바스크립트 실행 환경에서 추가로 제공하는 객체
  • 사용자 정의 객체 = 사용자가 직접 정의한 객체

표준 빌트인 객체

  • Math, Reflect, JSON을 제외한 표준 빌트인 객체
    = 인스턴스를 생성할 수 있는 생성자 함수 객체
    = 프로토타입 메서드와 정적 메서드를 제공

  • 표준 빌트인 객체의 prototype 프로퍼티에 바인딩된 객체
    = 다양한 기능의 빌트인 프로토타입 메서드를 제공

  • 표준 빌트인 객체
    = 인스턴스 없이도 호출 가능한 빌트인 정적 메서드 제공


원시값과 래퍼 객체

const str = 'hello';

// 원시 타입인 문자열이 프로퍼티와 메서드를 갖고 있는 객체처럼 동작
console.log(str.length); // 5
console.log(str.toUpperCase()); // HELLO
  • 자바스크립트 엔진이 일시적으로 원시값을 연관된 객체로 변환
    → 암묵적으로 연관된 객체를 생성하여 생성된 객체로 프로퍼티에 접근하거나 메서드를 호출하고 다시 원시값으로 되돌림
    = 래퍼 객체

// ① 식별자 str은 문자열을 값으로 가짐
const str = 'hello';

// ② 식별자 str은 암묵적으로 생성된 래퍼 객체를 가리킴
// 식별자 str의 값 'hello'는 래퍼 객체의 [[StringData]] 내부 슬롯에 할당
str.name = 'Lee';

// ③ 식별자 str은 다시 원래의 문자열, 
// 즉 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된 원시값을 가짐
// ②에서 생성된 래퍼 객체는 아무도 참조하지 않으므로 가비지 컬렉션의 대상이 됨

// ④ 식별자 str은 새롭게 암묵적으로 생성된 래퍼 객체를 가리킴
// 새롭게 생성된 래퍼 객체에는 name 프로퍼티가 존재하지 않음
console.log(str.name); // undefined

// ⑤ 식별자 str은 다시 원래의 문자열, 
// 즉 래퍼 객체의 [[StringData]] 내부 슬롯에 할당된 원시값을 가짐
console.log(typeof str, str); // string hello

전역 객체

= 코드가 실행되기 이전 단계에 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체 (= 최상위 객체)

window.parseInt('F', 16); // → 15
parseInt('F', 16); // → 15

window.parseInt === parseInt // → true

// var 키워드로 선언한 전역 변수
var foo = 1;
console.log(window.foo); // 1

// 선언하지 않은 변수에 값을 암묵적 전역.
// bar은 전역 변수가 아닌 전역 객체의 프로퍼티
bar = 2;
console.log(window.bar); // 2

// 전역 함수
function baz() { return 3; }
console.log(window.baz()); // 3

빌트인 전역 프로퍼티

  • Infinity = 무한대를 나타내는 숫자 값 Infinity
  • NaN = 숫자가 아님 (Not-a-Number)'

빌트인 전역 함수

  • eval = 자바스크립트 코드를 나타내는 문자열을 인수로 전달받음
    (표현식 = 런타임에 평가하여 값 생성 / 표현식X = 런타임에 실행)
    (여러 개의 문 = 마지막 결과값 반환)
    (기존 스코프를 런타임에 동적으로 수정)
  • isFinite = 전달받은 인수가 정상적인 유한수인지 검사
  • isNaN = 전달받은 인수가 NaN인지 검사
  • parseFloat = 전달받은 문자열 인수를 실수로 해석하여 반환
  • parseInt = 전달받은 문자열 인수를 정수로 해석하여 반환
  • encodeURI = URI를 문자열로 전달받아 이스케이프 처리를 위해 인코딩
  • decodeURI = 인코딩된 URI를 인수로 전달받아 이스케이프 처리 이전으로 디코딩
  • encodeURIComponent = URI 구성 요소를 인수로 전달받아 인코딩
  • decodeURIComponent = 매개변수로 전달된 URI 구성 요소를 디코딩

암묵적 전역

var x = 10; // 전역 변수

function foo() {
  // 선언하지 않은 식별자에 값 할당
  y = 20;
}
foo();

// 선언하지 않은 식별자 y를 전역에서 참조 가능
console.log(x + y); // 30

y = 20window.y = 20으로 해석하여 전역 객체에 프로퍼티를 동적 생성
→ y는 전역 객체의 프로퍼티가 되어 마치 전역 변수처럼 동작 = 암묵적 전역

profile
빙글빙글돌아가는..

0개의 댓글