ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Javascript] 전역객체, 표준 빌트인 객체, 래퍼 객체, valueof, 빌트인전역프로퍼티, 빌트인전역함수, eval, isFinite,isNaN,parseFloat, parseInt,encodeURI,encodeURIComponent,decodeURI
    웹/JavaScript 2023. 1. 12. 09:14

    I. 전역 객체 global object

    • 언제 어디서든 들어마실 수 있는 공기와도 같은...
    • 코드로 선언하거나 하지 않아도 전역 범위에 항상 존재하는 객체
    • 👉 MDN 문서 보기

     

    브라우저의 콘솔에 출력해 볼 것

    console.log(this);

     

    console.log(
    this === window,
    window === self,
    self === frames
    );

    Node.js에서 문서로 실행해 볼 것

    console.log(this);
    // ⚠️ Node.js로 문서 실행시의 this는 전역 객체를 가리키지 않음
    // 이후 모듈 관련 강에서 배울 것

     

    console.log(global);

    ⭐️ globalThis 통일된 식별자 - 양쪽 모두에서 실행해 볼 것

    console.log(globalThis);



    💡 전역 객체에 포함되는 것

    1. 표준 빌트인 객체
    2. 호스트 객체 - 환경에서 제공하는 기타 객체들 : 브라우저의 Web API, Node.js API 등
    3. (브라우저 한정) - 전역으로 설정된 var 변수와 전역 함수
    var myGlobalVar = 1;
    const myGlobalConst = 1;
    function myGlobalFunc () {};
    console.log(
    globalThis.myGlobalVar,
    globalThis.myGlobalConst,
    globalThis.myGlobalFunc
    );




     

    II. 표준 빌트인 객체 standard built-in objects

    👉 MDN 문서 보기

    • ECMAScript 사양에 정의된 객체들 - 어떤 환경에서든 사용 가능
    • 전역 프로퍼티로 제공됨 - globalThis등을 붙이지 않고 바로 사용 가능
    • 👉 표준 빌트인 객체 MDN 문서

     

    💡 Node.js에서는 globalThis 출력시 표준 빌트인 객체들은 출력하지 않음

    console.log(globalThis);

     

    // 그러나 요소들로 갖고 있는 것은 확인 가능
    console.log(globalThis.Infinity);
    console.log(globalThis.isNaN);
    console.log(globalThis.Object);




     

    III. 래퍼 객체 wrapper object

    const str = 'abcde';
    console.log(
    str.length,
    str.toUpperCase(),
    str[0]
    );

     

    const num = 123.4567;
    console.log(
    typeof num.toString(),
    num.toFixed(2)
    );
    • 원시값이 어떻게 프로퍼티를 갖고 있을까?

     

    💡 콘솔에서 프로퍼티와 프로토타입을 펼쳐 확인해보자.

    const str = new String('abcde');
    const num = new Number(123.4567);
    const bool = new Boolean(true);
    console.log(typeof str, str);
    console.log(typeof num, num);
    console.log(typeof bool, bool);



    Number, String, Boolean 등은 표준 빌트인 객체에 속하는 래퍼 객체

    • 원시값을 필요시 래퍼 객체로 감싸서 wrap 그것의 인스턴스로 만들어 기능 실행
    • 원시값에서 객체를 사용하듯 해당 래퍼 객체의 프로퍼티를 호출할 때 래핑이 발생

    ⭐️ 해당 기능 사용 후에는 원시 객체로 돌아감 - 메모리 절약

    const str = 'abcde';
    console.log(str.length);
    console.log(typeof str, str);

    valueOf 함수 - 래퍼 객체의 인스턴스에서 원시값 반환

    const str = new String('abcde');
    const num = new Number(123.4567);
    const bool = new Boolean(true);
    console.log(str.valueOf());
    console.log(num.valueOf());
    console.log(bool.valueOf());
     

    I. 빌트인 전역 프로퍼티

    👉 MDN 문서 보기

    스스로 다른 프로퍼티나 메서드를 갖지 않고 값만 반환

    console.log(globalThis.Infinity);
    console.log(globalThis.NaN);
    console.log(globalThis.undefined);

     

    console.log(globalThis.globalThis);

     

    console.log(
    globalThis == globalThis.globalThis,
    globalThis == globalThis.globalThis.globalThis,
    globalThis == globalThis.globalThis.globalThis.globalThis
    );
    • Infinity, NaN, undefined 등의 원시값들은 이 프로퍼티들을 가리킴
    • 💡 null은 포함되지 않음 - 가리키는 값이 없음을 의미하므로...
    • globalThis 스스로에 대한 참조를 프로퍼티로 포함




     

    II. 빌트인 전역 함수

    👉 MDN 문서 보기

    1. eval - 문자열로 된 코드를 받아 실행

    값을 반환하는 코드(표현식)이라면 해당 값을 반환

    const x = eval('1 + 2 + 3');
    // 객체나 함수의 리터럴은 괄호로 감싸야 함
    const obj = eval('({a: 1, b: 2})');
    console.log(x, obj);

    표현식이 아닐 경우 해당 코드 실행

    const code = `
    let x = 1;
    console.log(x++, x);
    `;
    eval(code);

    ⚠️ 매우 특별한 경우가 아닌 이상 절대 사용하지 말 것

    • ☢️ 보안에 취약함
    • 엔진이 코드를 최적화하지 못하므로 처리 속도가 느림
    • 👉 관련 MDN 문서



    2. isFinite - 유한수 여부 반환

    console.log(
    isFinite(1),
    isFinite(0),
    isFinite('1'),
    isFinite(null)
    );
    • 유한수이거나 유한수로 평가될 수 있는 (null은 0) 값 : true

     

    console.log(
    isFinite(1/0),
    isFinite(Infinity),
    isFinite(-Infinity),
    isFinite(NaN),
    isFinite('abc')
    );
    • 무한수이거나 수로 평가될 수 없는 값: false



    3. isNaN - NaN 여부 반환

    console.log(
    isNaN(NaN),
    isNaN('abcde'),
    isNaN({}),
    isNaN(undefined)
    );
    • 숫자로 인식될 수 없는 값 : true
    • Number 타입이 아닌 경우 Number로 변환하여 평가 NaN도 타입은 Number
    • 💡 뒤에 배울 Number.isNaN은 타입변환을 하지 않음



    4. parseFloat - 인자로 받은 값을 실수로 변환

    console.log(
    parseFloat(123.4567),
    parseFloat('123.4567'),
    parseFloat(' 123.4567 ')
    );
    • 문자열의 경우 앞뒤공백은 무시
    console.log(
    parseFloat('123.0'),
    parseFloat('123'),
    parseFloat(' 123ABC '),
    parseFloat([123, 456, 789])
    );
    • 숫자로 시작할 경우 읽을 수 있는 부분까지 숫자로 변환
    • 배열의 경우 첫 요소가 숫자면 해당 숫자 반환
    console.log(
    parseFloat('ABC123'),
    parseFloat({x: 1}),
    parseFloat([]),
    parseFloat(['a', 1, true])
    );
    • 기타 숫자로 변환이 안 되는 경우 NaN 반환



    5. parseInt - 인자로 받은 값을 정수(타입은 실수)로 변환

    console.log(
    parseInt(123),
    parseInt('123'),
    parseInt(' 123.4567 '),
    parseInt('345.6789')
    );
    • 소수점 뒤로 오는 숫자는 버림 반올림하지 않음
    console.log(
    parseInt('abc'),
    parseInt('{}'),
    parseInt('[]')
    );

     

    💡 두 번째 인자로 숫자(2~36) 넣으면

    console.log(
    parseInt('11'),
    parseInt('11', 2),
    parseInt('11', 8),
    parseInt('11', 16),
    parseInt('11', 32),
    parseInt('11', 37),
    parseInt('11', 'A'),
    );
    • 주어진 값을 해당 진법의 숫자로 해석하여 10진법 숫자로 반환
    • 무효한 숫자는 NaN 반환



    6. encodeURI, encodeURIComponent

    const encodedURI = encodeURI(searchURI);
    console.log(encodedURI);
    • URI(인터넷 자원의 주소)는 🔗 아스키 문자 셋으로만 구성되어야 함
    • 아스키가 아닌 문자(한글 등)와 일부 특수문자를 포함한 URI를 유효하게 인코딩

     

    const keyword = '얄코';
    const encodedKeyword = encodeURIComponent(keyword);
    console.log(encodedKeyword);

     

    const searchURI = `https://www.google.com/search?q=${encodedKeyword}`;
    console.log(searchURI);
    • URI에 들어갈 요소를 인코딩

     

    💡 둘의 정확한 차이

    const raw = '?q=얄코';
    console.log(encodeURI(raw));
    console.log(encodeURIComponent(raw));
    • URI에서 특정 기능을 갖는 =, ?, & 등을 인코딩하는가의 여부
    • encodeURI는 인자를 완성된 URI로, encodeURIComponent는 요소로 인식하기 때문



    7. decodeURI, decodeURIComponent

    encodeURI(Component)와 반대로 동작

    const decodedURI = decodeURI(encodedURI);
    console.log(decodedURI);

     

    const encodedComp = '%EC%96%84%EC%BD%94';
    const decodedComp = decodeURI(encodedComp);
    console.log(decodedComp);
     
Designed by Tistory.