자바스크립트

Section 6. 자바스크립트 빌트인 전역 프로퍼티와 함수

포칼이 2023. 3. 30. 15:05

I. 빌트인 전역 프로퍼티

스스로 다른 프로퍼티나 메서드를 갖지 않고 값만 반환하는 특징이 있다.

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

console.log(globalThis.globalThis);
//Window {window: Window, self: Window, document: document, name: '강남', location: Location, …}

console.log(
  globalThis == globalThis.globalThis,
  globalThis == globalThis.globalThis.globalThis,
  globalThis == globalThis.globalThis.globalThis.globalThis
); //true true true

Infinity, NaN, undefined등의 원시값들은 이 프로퍼티들을 가리킨다는 것을 알 수 있다. 

그리고 globalThis안에는 globalThis가 또 있는데 이유는 globalThis는 스스로에 대한 참조를 프로퍼티로 포함하기 때문이다.

 

II. 빌트인 전역 함수

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

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

const x = eval('1 + 2 + 3');

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

console.log(x, obj); //6 {a: 1, b: 2}

값을 반환하는 것을 알 수 있다. 

 

표현식이 아닐 경우에는 해당 코드를 실행한다.

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

eval(code); //1 2

그냥 이런게 있다는 것만 알고 넘어가자. 왜냐하면 eval은...

  • 보안에 매우 취약하다
  • 엔진이 코드를 최적화하지 못하므로 처리 속도가 느리다

2. isFinite- 유한수 여부 반환

console.log(
  isFinite(1),
  isFinite(0),
  isFinite('1'),
  isFinite(null)
);
//true true true true

유한수이거나 유한수로 평가될 수 있는 (null은 0)값은 true로 반환된다. 

console.log(
  isFinite(1/0),
  isFinite(Infinity),
  isFinite(-Infinity),
  isFinite(NaN),
  isFinite('abc')
); //false false false false false

반대로 무한수이거나 수로 평가될 수 없는 값은 false로 반환된다. 

 

3. isNaN - NaN 여부 반환

console.log(
  isNaN(NaN),
  isNaN('abcde'),
  isNaN({}),
  isNaN(undefined)
); //true true true true

숫자로 인식될 수 없는 값은 true로 반환된다. 

Number 타입이 아닌 경우 Number로 변환하여 평가한다. NaN도 타입은 Number다

 

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

console.log(
  parseFloat(123.4567),
  parseFloat('123.4567'),
  parseFloat(' 123.4567 ')
); //123.4567 123.4567 123.4567

문자열의 경우 앞뒤공백은 무시한다. 

console.log(
  parseFloat('123.0'),
  parseFloat('123'),
  parseFloat(' 123ABC '),
  parseFloat([123, 456, 789])
); //123 123 123 123

숫자로 시작할 경우 읽을 수 있는 부분까지 숫자로 변환한다.

배열의 경우 첫 요소가 숫자면 해당 숫자를 반환한다.

console.log(
  parseFloat('ABC123'),
  parseFloat({x: 1}),
  parseFloat([]),
  parseFloat(['a', 1, true])
); //NaN NaN NaN NaN

기타 숫자로 변환이 안 되는 경우 NaN을 반환한다.

 

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

console.log(
  parseInt(123),
  parseInt('123'),
  parseInt(' 123.4567 '),
  parseInt('345.6789')
); //123 123 123 345

소수점 뒤로 오는 숫자는 버린다. 반올림하지 않는다

console.log(
  parseInt('abc'),
  parseInt('{}'),
  parseInt('[]')
); //NaN NaN NaN

역시 숫자로 변환이 안 되는 경우 NaN을 반환한다.

 

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

console.log(
  parseInt('11'),
  parseInt('11', 2),
  parseInt('11', 8),
  parseInt('11', 16),
  parseInt('11', 32),

  parseInt('11', 37),
  parseInt('11', 'A'),
); //11 3 9 17 33 NaN 11

주어진 값을 해당 진법의 숫자로 해석해서 10진법 숫자로 반환한다.

무효한 숫자는 NaN으로 반환되는 것을 볼 수 있다.

 

6. encodeURI, encodeURIComponent

const searchURI = 'https://www.google.com/search?q=얄코';
const encodedURI = encodeURI(searchURI);

console.log(encodedURI);
//https://www.google.com/search?q=%EC%96%84%EC%BD%94

searchURI를 주소창에 쳐보면 그대로 나오지만 그 주소를 메모장에 복사해보면 알수 없는 문자로 바뀌어서 출력되는 것을 볼 수 있다.  이렇게 되는 이유는 다음과 같다.

  • URI(인터넷 자원의 주소)는 아스키 문자 셋(알파벳이나 우리가 쓰는 특수 문자들)으로만 구성되어야 하기 때문이다
  • 아스키가 아닌 문자(한글 등)와 일부 특수문자를 포함한 URI를 유효하게 인코딩 한다.

즉, 얄코 이부분은 아스키 문자 셋이 아니기 때문에 아스키 문자 셋을 이용해서 변환되는(인코딩) 것이다. 

 

const keyword = '얄코';
const encodedKeyword = encodeURIComponent(keyword);

console.log(encodedKeyword); //%EC%96%84%EC%BD%94

keyword가 변환된 것을 볼 수 있다. 그런데 얼핏보면 encodeURI와 encodeURIComponent가 하는 일이 같은 것 같다. 

 

둘의 차이는 다음과 같다.

const raw = '?q=얄코';
console.log(encodeURI(raw)); //?q=%EC%96%84%EC%BD%94
console.log(encodeURIComponent(raw)); //%3Fq%3D%EC%96%84%EC%BD%94

?q= 이 부분을 encodeURI에서는 그대로 놔뒀고 encodeURIComponent는 그 부분까지 바꿔버린 것을 볼 수 있다. 

 

이유는 다음과 같다.

  • URI에서 특정 기능을 갖는 =, ?, & 등을 인코딩하는가의 여부
  • encodeURI는 인자를 완성된 URI로, encodeURIComponent는 요소로 인식하기 때문이다. 

7. decodeURI, decodeURIComponent

encode가 있으면 decode도 있다. decode는 encode와 반대로 동작한다.

const encodedURI = 'https://www.google.com/search?q=%EC%96%84%EC%BD%94';
const decodedURI = decodeURI(encodedURI);

console.log(decodedURI);
//https://www.google.com/search?q=얄코

const encodedComp = '%EC%96%84%EC%BD%94';
const decodedComp = decodeURI(encodedComp);

console.log(decodedComp); //얄코