웹/JavaScript
[Javascript] 전역객체, 표준 빌트인 객체, 래퍼 객체, valueof, 빌트인전역프로퍼티, 빌트인전역함수, eval, isFinite,isNaN,parseFloat, parseInt,encodeURI,encodeURIComponent,decodeURI
Judith Hopps
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);
💡 전역 객체에 포함되는 것
- 표준 빌트인 객체
- 호스트 객체 - 환경에서 제공하는 기타 객체들 : 브라우저의 Web API, Node.js API 등
- (브라우저 한정) - 전역으로 설정된 var 변수와 전역 함수
var myGlobalVar = 1;
const myGlobalConst = 1;
function myGlobalFunc () {};
console.log(
globalThis.myGlobalVar,
globalThis.myGlobalConst,
globalThis.myGlobalFunc
);
II. 표준 빌트인 객체 standard built-in objects
- 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. 빌트인 전역 프로퍼티
스스로 다른 프로퍼티나 메서드를 갖지 않고 값만 반환
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. 빌트인 전역 함수
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);
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);
반응형