[딥다이브] 011. 빌트인 객체

1. 자바스크립트 객체의 분루

자바스크립트 객체는 크게 3개의 객체로 분류.

  • 표준 빌트인 객체 : ECMAScript 사양에 정의된 객체. 실행환경에 관계없이 언제나 사용 가능
  • 호스트 객체 : 실행 환경 (브라우저 환경 또는 node.js 환경)에서 추가로 제공하는 객체
  • 사용자 정의 객체: 기본 제공되는 객체가 아닌 사용자가 직접 정의한 객체

2. 표준 빌트인 객체

  • ObjectStringNumberDateMathRegExpArrayMapSet
    PromiseReflectProxyJSONError 등 40여 개의 표준 빌트인 객체
  • 생성자 함수 객체 - 프로토타입 메서드, 정적 메서드 제공
  • MathReflectJSON - 정적 메서드 제공
//String 생성자 함수에 의한 String 객체 생성
const strObj = new String('Lee'); // String {"Lee"}
console.log(typeof strObj); // object

//Number 생성자 함수에 의한 Number 객체 생성
const numObj = new Number(123); // Number {123}
console.log(typeof numObj); // object

//Function 생성자 함수에 의한 Function 객체(함수) 생성
const func = new Function('x', 'return x * x'); // f anonymous(x) { return x * x }
console.log(typeof func); // object

3. 원시값과 래퍼 객체

문자열,숫자,불리언 등의 원시값이 있음에도 이들을 생성하는 생성자 함수가 존재하는 이유는 뭘까?

결론은 인스턴스를 생성할 필요가 없어 권장하지 않음

const str = 'hello';

console.log(str.length); // 5
console.log(str.toUpperCase()); // HELLO

//원기값은 객체가 아니기 때문에 프로퍼티나 메서드를 가질 수 없는데도 불구하고,
//마치 프로퍼티와 메서드를 갖는 객체처럼 동작함
//예시
const str = {
	length : 5,
	toUpperCase(){
	}
}

이는 원시값인 문자열, 숫자, 불리언 값의 경우에 마침표 또는 대괄호 표기법으로 접근하면 자바스크립트 엔진이 일시적으로 원시값을 연관된 객체로 변환해주기 때문.

문자열, 숫자, 불리언 값에 대해 객체처럼 접근하면 생성되는 임시 객체를 래퍼 객체(wrapper object) 라 한다.

프로퍼티를 참조하고 메서드를 호출한 뒤, 다시 원시 값으로 되돌림.

래퍼 객체에 의해 문자열,숫자,불리언을 객체처럼 사용할 수 있기 때문에

생성자 함수로 문자열,숫자,불리언 인스턴스를 생성할 필요가 없고 권장하지않음.

4. 전역 객체

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

  • 브라우저 환경 : window
  • Node.js 환경 : global
  • 전역 객체가 갖고 있는 프로퍼티
    • 표준 빌트인 객체
    • 환경에 따른 호스트 객체 (클라이언트 Web API나 Node.js의 호스트 API)
  • var 키워드로 선언한 전역 변수와 전역 함수
//var키워드로 선언한 전역변수

var foo = 1;
console.log(window.foo); // 1

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

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

//let, const 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티 아님
let foo = 123;
console.log(window.foo); // undefined

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

전역 객체는 몇 가지 프로퍼티와 메서드를 가지고 있다. 이에 대해 살펴보자.

4.1 빌트인 전역 프로퍼티

Infinity

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

console.log(Infinity); // Infinity
// 양의 무한대
console.log(3/0); // Infinity
// 음의 무한대
console.log(-3/0); // -Infinity
// Infinity는 숫자값이다.
console.log(typeof Infinity); // number

NaN

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

console.log(NaN); // NaN
console.log(Number('xyz')); // NaN
console.log(1 * 'string'); // NaN
console.log(typeof NaN); // number

undefined

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

console.log(window.undefined); // undefined

var foo;
console.log(foo); // undefined
console.log(typeof undefined); // undefined

4.2 빌트인 전역 함수

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

isNaN

전달받은 인수가 NaN인지 검사하여 그 결과를 불리언 타입으로 반환한다. 전달받은 인수의 타입이 숫자가 아닌 경우 숫자로 타입을 변환한 후 검사를 수행한다.

//숫자
isNaN(NaN);                   // true
isNaN(10);                    // false

//문자열
isNaN('10');                  // false  '10' => 10
isNaN('');                    // false  '' => 0

//불리언
isNaN(true);                  // false  true => 1
isNaN(null);                  // false  null => 0

//undefined
isNaN(undefined);             // true

//객체
isNaN({});                    // true

//date
isNaN(new Date());            // false  new Date() => Number
isNaN(new Date().toString()); // true   String => NaN

parseFloat

전달받은 문자열 인수를 실수로 해석하여 반환한다.

parseFloat(string);

parseFloat('3.14'); // 3.14
parseFloat('10.00'); // 10

parseInt

전달받은 문자열 인수를 정수로 해석하여 반환한다

parseInt(string, radix);

parseInt('10'); // 10
parseInt('10.123'); // 10

parseiInt('10',2) // 2

encodeURI / decodeURI

  • URI(Uniform Resource Identifier): 인터넷에 있는 자원을 나타내는 주소
  • encodeURI 함수 : URI를 문자열로 전달받아 이스케이프 처리를 위해 인코딩
  • decodeURI 함수 : 인코딩된 URI를 인수로 전달받아 디코딩
  • 알파벳, 0~9숫자, ! ~ * 등 문자는 이스케이프 처리에서 제외
const uri = 'http://example.com?name=홍길동&job=programmer';

//인코딩
const enc = encodeURI(uri);
console.log(enc); // http://example.com?name=%ED%99%8D%EA%B8%B8%EB%8F%99&job=programmer

//디코딩 
const dec = decodeURI(enc);
console.log(dec); // http://example.com?name=홍길동&job=programmer

encodeURIComponent / decodeURIComponent

  • encodeURIComponent 함수 : URI 구성 요소를 인수로 전달받아 인코딩 인수로 전달된 문자열을 쿼리 스트링의 일부로 간주하여, 쿼리스트링 구분자로 사용되는 =?& 까지 인코딩
  • encodeURI 함수: 매개변수로 전달된 문자열을 완전한 URI 전체라고 간주해 쿼리 스트링 구분자는 인코딩하지 않는다.
  • decodeURIComponent 함수 : 매개변수 전달된 URI 구성 요소를 디코딩
const uriComp = 'name=김철수&job=programmer';

//쿼리스트링까지 인코딩
let enc = encodeURIComponent(uriComp);
console.log(enc); // %ED%99%8D%EA%B8%B8%EB%8F%99%26job%3Dprogrammer

//디코딩
let dec = decodeURIComponent(enc);
console.log(dec); // 김철수&job=programmer

enc = encodeURI(uriComp);
console.log(enc); // %ED%99%8D%EA%B8%B8%EB%8F%99&job=programmer

dec = decodeURI(enc);
console.log(dec); // name=김철수&job=programmer

4.3 암묵적 전역

  • 암묵적 전역 : 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티 ( ≠ 전역변수 )
var x = 10; // 전역 변수

function foo(){
	y = 20; // window.y = 20; 함수스코프 뚫고나감
}

foo();

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

좋은 웹페이지 즐겨찾기