빌트인 전역 함수 built-in global function은 애플리케이션 전역에서 호출할 수 있는 빌트인 함수로서 전역 객체의 메서드
eval
eval 함수는 자바스크립트 코드를 나타내는 문자열을 인수로 전달 받음
전달 받은 문자열 코드가 표현식: 문자열 코드를 런타임에 평가하여 값 생성
전달 받은 문자열 코드가 표현식이 아닌 문: 문자열 코드를 런타임에 실행
문자열 코드가 여러 개의 문: 모든 문 실행
eval 함수는 기존의 스코프를 런타임에 동적으로 수정
strict mode에서는 기존의 스코프를 수정하지 않고 eval 함수 자신의 자체적인 스코프 생성
인수로 전달 받은 문자열 코드가 let, const 키워드를 사용한 변수 선언문이면, 암묵적으로 strict mode 적용
eval 함수 사용은 금지해야 함
eval 함수를 통해 사용자로부터 입력 받은 콘텐츠 untrusted data를 실행하는 것은 보안에 취약
eval 함수를 통해 실행되는 코드는 자바스크립트 엔진에 의해 최적화가 수행되지 않으므로 처리가 느림
// 표현식인 문
console.log(eval("1 + 2;")); // 2
// 표현식이 아닌 문
console.log(eval("var x = 5;")); // undefined
// eval 함수에 의해 런타임에 변수 선언문이 실행되어 x 변수가 선언
console.log(x); // 5
// 객체 리터럴, 함수 리터럴은 반드시 괄호로 둘러쌈
const o = eval("({a: 1})");
console.log(o); // { a: 1 }
const f = eval("(function() {return 1;})");
console.log(f()); // 1
// eval 함수는 자신이 호출된 위치에서 해당하는 기존의 스코프를 런타임에 동적으로 수정
const z = 1;
function foo() {
console.log(z); // 1 - 선언 단계에 실행되었다면 undefined가 되었어야 함
// eval 함수는 런타임에 foo 함수의 스코프를 동적으로 수정
eval("var z = 2;");
console.log(z); // 2
}
foo();
console.log(z); // 1
isFinite
전달받은 인수가 유한수이면 true / 무한수이면 false를 반환
전달 받은 인수의 타입이 숫자가 아닌 경우, 숫자로 타입을 변환 후 검사 실행 (NaN은 false 반환, null은 true 반환)
inNaN
전달 받은 인수가 NaN인지 검사하여 결과를 불리언으로 반환
전달 받은 인수의 타입이 숫자가 아닌 경우, 숫자로 타입을 변환 후 검사 실행
parseFloat
전달받은 문자열 인수를 부동 소수점 숫자 floating point number, 즉 실수로 해석 parsing하여 반환
parseInt
전달받은 문자열 인수를 정수 integer로 해석하여 반환
전달받은 인수가 문자열이 아니면 문자열로 변환한 다음 정수로 해석하여 반환
두 번째 인수로 진법을 나타내는 기수 (2 ~ 36) 전달 가능, 이때 인수로 전달된 문자열을 해당 기수의 숫자로 해석하여 10진수로 해석하여 반환
10진수를 해당 기수의 문자열로 변경하고 싶을 경우 Number.prototype.toString 메서드 사용
첫 번째 인수로 전달된 문자열이 "0x" 또는 "0X"로 시작하는 16진수 리터럴이면 16진수로 해석하여 10진수로 반환(2진수와 8진수 리터럴은 해당 안됨)
앞 뒤 공백은 무시하고 중간에 공백이 있으면 공백으로 구분된 앞에만 해석하여 반환
// 전달 받은 문자열 인수를 문자열이 아니면 문자열로 변환하고 정수로 해석하여 반환
console.log(parseInt(10.123)); // 10
// "10"을 8진수로 해석하고, 그 결과를 10진수 정수 반환
console.log(parseInt("10", 8)); // 8
// Number.prototype.toString 메서드를 사용하여 10을 8진수로
console.log((10).toString(8)); // 12
// 16진수 리터럴 자동으로 16진수로 해석하여 10진수로 반환
console.log(parseInt("0x0000000f")); // 15
// 앞뒤 공백 무시, 중간에 공백이 있을 경우 공백으로 구분된 앞에만 해석하여 반환
console.log(parseInt(" 0x0000000f 34 ")); // 15
encodeURI / decodeURI
encodetURI 함수는 완전한 URI Uniform Resource Identifier를 문자열로 전달받아 이스케이프 처리를 위해 인코딩
URI는 인터넷에 있는 자원을 나타내는 유일한 주소를 말함. 하위 개념으로 URL, URN이 있음
URI 문법 형식 표준 RFC3986에 따르면 URL은 아스키 문자 셋으로만 구성되어야 하며, 쿼리 스트링 구분자로 사용되는 (=, ? , &)을 제외하고 이스케이프 처리
URI
const uri = "http://example.com?name=진홍엽&status=jobless&hopeful";
// encodeURI 함수는 완전한 URI를 전달받아 이스케이프 처리를 위해 인코딩
const enc = encodeURI(uri);
console.log(enc); // http://example.com?name=%EC%A7%84%ED%99%8D%EC%97%BD&status=jobless&hopeful
// decodeURI 함수는 인코딩된 URI를 전달받아 이스케이프 처리 이전으로 디코딩
const dec = decodeURI(enc);
console.log(dec); // http://example.com?name=진홍엽&status=jobless&hopeful
encodeURIComponent / decodeURIComponent
URI 구성요소를 인수로 전달받아 인코딩
쿼리 스트링 구분자로 사용되는 =, ?, &까지 인코딩하는 차이가 있음
const uriComp = "name=진홍엽&status=jobless&hopeful";
let enc = encodeURIComponent(uriComp);
console.log(enc); // name%3D%EC%A7%84%ED%99%8D%EC%97%BD%26status%3Djobless%26hopeful
let dec = decodeURIComponent(enc);
console.log(dec); // name=진홍엽&status=jobless&hopeful
enc = encodeURI(uriComp);
console.log(enc); // name=%EC%A7%84%ED%99%8D%EC%97%BD&status=jobless&hopeful
dec = decodeURI(enc);
console.log(dec); // name=진홍엽&status=jobless&hopeful
암묵적 전역
암묵적 전역 implicit global: 선언하지 않은 식별자에 값을 할당하면 전역 객체의 프로퍼티를 동적 생성하여 전역 변수처럼 동작
전역 객체의 프로퍼티이므로 변수가 아님. 따라서 변수호이스팅이 발생하지 않음
변수가 아니라 단지 프로퍼티이므로 delete로 삭제 가능, 전역 변수는 프로퍼티이지만 delete로 삭제 불가능
// 전역 변수 x는 호이스팅 발생
console.log(x); // undefined
// 전역 객체의 프로퍼티 y는 호이스팅 발생 x
// console.log(y); // ReferenceError: y is not defined
var x = 10; // 전역 변수
function foo() {
y = 20; // 선언하지 않은 식별자에 값을 할당 (전역 객체의 프로퍼티로 y 추가)
}
foo();
// 선언하지 않은 식별자 y를 전역에서 참조할 수 있음
console.log(x + y); // 30