poiemaweb / javascript스터디 7
1. 빌트인 객체
1-1. 네이티브 객체
- ECMAScript 명세에 정의된 객체를 말하며 애플리케이션 전역의 공통 기능을 제공한다. 네이티브 객체는 애플리케이션의 환경과 관계없이 언제나 사용할 수 있다.
- Object, String, Number, Function, Array, RegExp, Date, Math와 같은 객체 생성에 관계가 있는 함수 객체와 메소드로 구성된다.
- 네이티브 객체를 Global Objects라고 부르기도 하는데 이것은 전역 객체(Global Object)와 다른 의미로 사용되므로 혼동에 주의하여야 한다.
- 전역 객체(Global Object)는 모든 객체의 최상위 객체를 의미하며 일반적으로 Browser-side에서는 window, Server-side(Node.js)에서는 global 객체를 의미한다.
1-1-1. Object
- Object() 생성자 함수는 객체를 생성한다. 만약 생성자 인수값이 null이거나 undefined이면 빈 객체를 반환한다.
- 그 이외의 생성자 함수의 경우 생성자 함수의 인수값에 따라 강제 형변환된 객체가 반환된다. 이때 반환된 객체의 [[Prototype]] 프로퍼티에 바인딩된 객체는 Object.prototype이 아니다.
- String, Number, Boolean등 다른 생성자 함수로 만들어진 객체의 [[prototype]]은 다르다.
- 객체를 생성할 경우 특수한 상황이 아니라면 객체리터럴 방식을 사용하는 것이 일반적이다.
1-1-2. Function
- 자바스크립트의 모든 함수는 Function 객체이다. 다른 모든 객체들처럼 Function 객체는 new 연산자을 사용해 생성할 수 있다.
var adder = new Function('a', 'b', 'return a + b');
adder(2, 6); // 8
- 보안 문제 및 eval과 유사한(그러나 훨씬 덜 심각한) 성능 문제가 발생할 수 있습니다.
하지만 eval과 달리, Function 생성자는 전역 범위로 한정된 함수만 생성합니다.
1-1-3 Boolean
- Boolean 객체는 원시 타입 boolean을 위한 레퍼(wrapper) 객체이다. Boolean 생성자 함수로 Boolean 객체를 생성할 수 있다.
- 래퍼 객체는 빌트 인 생성자 함수로 만든 자료형을 만들 때 만들어지는 객체이다. 리터럴 방식으로 만들어진 자료형과 생성자 함수로 만들어진 래퍼 객체를 === 비교하면 같지 않음을 알 수 있다.
- 리터럴 방식으로 만들어진 원시 타입에 대해서 length등의 프로퍼티를 사용 할 수 있는 것은 사용 할 때 자동으로 래퍼 객체를 만들어서 프로퍼티를 사용하기 때문이다. 원시타입 자체의 프로퍼티가 아니다.
var x = new Boolean(false);
if (x) { // x는 객체로서 존재한다. 따라서 참으로 간주된다.
// . . . 이 코드는 실행된다.
}
1-1-4 Error
- Error 생성자는 error 객체를 생성한다. error 객체의 인스턴스는 런타임 에러가 발생하였을 때 throw된다.
try {
// foo();
throw new Error('Whoops!');
} catch (e) {
console.log(e.name + ': ' + e.message);
}
- Error 이외에 Error에 관련한 객체. 실제로 아래 함수를 이용하여 에러 객체를 생성가능하다.
- EvalError
- InternalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
1-1-5 Symbol
- Symbol은 ECMAScript 6(Javascript 2015) 에서 추가된 유일하고 변경 불가능한(immutable) 원시 타입으로 Symbol 객체는 원시 타입 Symbol 값을 생성한다.
1-1-6 그 외 네이티브 객체
- Number, Math, Date, String, RegExp, Array 등이 있다.
1-2. 호스트 객체
- 호스트 객체(Host object)는 브라우저 환경에서 제공하는 window, XmlHttpRequest, HTMLElement 등의 DOM 노드 객체와 같이 호스트 환경에 정의된 객체를 말한다.
- 브라우저에서 동작하는 환경과 브라우저 외부에서 동작하는 환경의 자바스크립트(Node.js)는 다른 호스트 객체를 사용할 수 있다.
- 브라우저에서 동작하는 환경의 호스트 객체는 전역 객체인 window, BOM(Browser Object Model)과 DOM(Document Object Model) 및 XMLHttpRequest 객체 등을 제공한다.
1-2-1. 전역 객체(Global Object)
- 전역 객체는 모든 객체의 유일한 최상위 객체를 의미하며 일반적으로 Browser-side에서는 window, Server-side(Node.js)에서는 global 객체를 의미한다.
1-2-2. BOM (Browser Object Model)
- 브라우저 객체 모델은 브라우저 탭 또는 브라우저 창의 모델을 생성한다. 최상위 객체는 window 객체로 현재 브라우저 창 또는 탭을 표현하는 객체이다. 또한 이 객체의 자식 객체 들은 브라우저의 다른 기능들을 표현한다. 이 객체들은 Standard Built-in Objects가 구성된 후에 구성된다.
- 전역 객체(Global Object)는 모든 객체의 최상위 객체를 의미하며 일반적으로 Browser-side에서는 window, Server-side(Node.js)에서는 global 객체를 의미한다.
- String, Number, Boolean등 다른 생성자 함수로 만들어진 객체의 [[prototype]]은 다르다.
var adder = new Function('a', 'b', 'return a + b');
adder(2, 6); // 8
- 보안 문제 및 eval과 유사한(그러나 훨씬 덜 심각한) 성능 문제가 발생할 수 있습니다.
하지만 eval과 달리, Function 생성자는 전역 범위로 한정된 함수만 생성합니다.
- 래퍼 객체는 빌트 인 생성자 함수로 만든 자료형을 만들 때 만들어지는 객체이다. 리터럴 방식으로 만들어진 자료형과 생성자 함수로 만들어진 래퍼 객체를 === 비교하면 같지 않음을 알 수 있다.
- 리터럴 방식으로 만들어진 원시 타입에 대해서 length등의 프로퍼티를 사용 할 수 있는 것은 사용 할 때 자동으로 래퍼 객체를 만들어서 프로퍼티를 사용하기 때문이다. 원시타입 자체의 프로퍼티가 아니다.
var x = new Boolean(false);
if (x) { // x는 객체로서 존재한다. 따라서 참으로 간주된다.
// . . . 이 코드는 실행된다.
}
try {
// foo();
throw new Error('Whoops!');
} catch (e) {
console.log(e.name + ': ' + e.message);
}
- EvalError
- InternalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
- 브라우저에서 동작하는 환경과 브라우저 외부에서 동작하는 환경의 자바스크립트(Node.js)는 다른 호스트 객체를 사용할 수 있다.
1-2-2. DOM (Document Object Model)
문서 객체 모델은 현재 웹페이지의 모델을 생성한다. 최상위 객체는 document 객체로 전체 문서를 표현한다. 또한 이 객체의 자식 객체들은 문서의 다른 요소들을 표현한다. 이 객체들은 Standard Built-in Objects가 구성된 후에 구성된다.
2. 전역객체
- 전역 객체(Global Object)는 모든 객체의 유일한 최상위 객체를 의미하며 일반적으로 Browser-side에서는 window, Server-side(Node.js)에서는 global 객체를 의미한다.
- 전역 객체는 실행 컨텍스트에 컨트롤이 들어가기 이전에 생성이 되며 constructor가 없기 때문에 new 연산자를 이용하여 새롭게 생성할 수 없다. 즉, 개발자가 전역 객체를 생성하는 것은 불가능하다.
- 전역 객체는 전역 스코프(Global Scope)를 갖게 된다.
- 전역 객체의 자식 객체를 사용할 때 전역 객체의 기술은 생략할 수 있다. 예를 들어 document 객체는 전역 객체 window의 자식 객체로서 window.document와 같이 기술할 수 있으나 일반적으로 전역 객체의 기술은 생략한다.
- 그러나 사용자가 정의한 변수와 전역 객체의 자식 객체 이름이 충돌하는 경우, 명확히 전역 객체를 기술하여 혼동을 방지할 수 있다.
function moveTo(url) {
var location = {'href':'move to '};
alert(location.href + url);
// location.href = url;
window.location.href = url;
}
moveTo('http://www.google.com');
- 전역 객체는 전역 변수(Global variable)를 프로퍼티로 가지게 된다. 전역 함수는 전역 객체의 메소드이다. 표준 빌트인 객체도 전역 객체의 자식 객체이다.
2-1. 전역 프로퍼티(Global property)
function moveTo(url) {
var location = {'href':'move to '};
alert(location.href + url);
// location.href = url;
window.location.href = url;
}
moveTo('http://www.google.com');
전역 프로퍼티는 전역 객체의 프로퍼티를 의미한다. 애플리케이션 전역에서 사용하는 값들을 나타내기 위해 사용한다. 전역 프로퍼티는 간단한 값이 대부분이며 다른 프로퍼티나 메소드를 가지고 있지 않다.
2-1-1. Infinity
-
Infinity 프로퍼티는 양/음의 무한대를 나타내는 숫자값 Infinity를 갖는다.
console.log(window.Infinity); // Infinity console.log(3/0); // Infinity console.log(-3/0); // -Infinity console.log(Number.MAX_VALUE * 2); // 1.7976931348623157e+308 * 2 console.log(typeof Infinity); // number
2-1-2. NaN
- NaN 프로퍼티는 숫자가 아님(Not-a-Number)을 나타내는 숫자값 NaN을 갖는다. NaN 프로퍼티는 Number.NaN 프로퍼티와 같다.
2-1-3. undefined
undefined 프로퍼티는 원시 타입 undefined를 값으로 갖는다.
2-2. 전역 함수(Global function)
- 전역 함수는 애플리케이션 전역에서 호출할 수 있는 함수로서 전역 객체의 메소드이다.
2-2-1. eval()
- 매개변수에 전달된 문자열 구문 또는 표현식을 평가 또는 실행한다. 사용자로 부터 입력받은 콘텐츠(untrusted data)를 eval()로 실행하는 것은 보안에 매우 취약하다. eval()의 사용은 가급적으로 금지되어야 한다.
- 브라우저에서 eval 실행을 거절 할 수 있다.
- node에서는 eval이 실행 된다.
2-2-2. isFinite()
- 매개변수에 전달된 값이 정상적인 유한수인지 검사하여 그 결과를 Boolean으로 반환한다. 매개변수에 전달된 값이 숫자가 아닌 경우, 숫자로 변환한 후 검사를 수행한다.
2-2-3. isNaN()
매개변수에 전달된 값이 NaN인지 검사하여 그 결과를 Boolean으로 반환한다. 매개변수에 전달된 값이 숫자가 아닌 경우, 숫자로 변환한 후 검사를 수행한다.
2-2-4. parseFloat()
매개변수에 전달된 문자열을 부동소수점 숫자(floating point number)로 변환하여 반환한다.
문자열의 첫 숫자만 반환되며 전후 공백은 무시된다. 그리고 첫문자를 숫자로 변환할 수 없다면 NaN을 반환한다.
2-2-5. parseInt()
- 매개변수에 전달된 문자열을 정수형 숫자(Integer)로 해석(parsing)하여 반환한다. 반환값은 언제나 10진수이다.
parseInt(string, radix); // string: 파싱 대상 문자열 // radix: 진법을 나타내는 기수(2 ~ 36, 기본값 10)
- 두번째 매개변수에 진법을 나타내는 기수를 지정하지 않더라도 첫번째 매개변수에 전달된 문자열이 “0x” 또는 “0X”로 시작한다면 16진수로 해석하여 반환한다.
- 기수를 지정하여 10진수 숫자를 해당 기수의 문자열로 변환하여 반환하고 싶을 때는 Number.prototype.toString 메소드를 사용한다.
- parseInt는 첫번째 매개변수에 전달된 문자열의 첫번째 문자가 해당 지수의 숫자로 변환될 수 없다면 NaN을 반환한다.
parseInt('A0')); // NaN parseInt('20', 2); // NaN
- 하지만 첫번째 매개변수에 전달된 문자열의 두번째 문자부터 해당 진수를 나타내는 숫자가 아닌
문자와 마주치면 이 문자와 계속되는 문자들은 전부 무시되며 해석된 정수값만을 반환한다.parseInt('1A0')); // 1 parseInt('102', 2)); // 2 parseInt('58', 8); // 5 parseInt('FG', 16); // 15
- 첫번째 매개변수에 전달된 문자열에 공백이 있다면 첫번째 문자열만 해석하여 반환하며 전후 공백은 무시된다. 만일 첫번째 문자열을 숫자로 파싱할 수 없는 경우, NaN을 반환한다.
2-2-6. encodeURI() / decodeURI()
- encodeURI()은 매개변수로 전달된 URI(Uniform Resource Identifier)를 인코딩한다.
- 여기서 인코딩이란 URI의 문자들을 이스케이프 처리하는 것을 의미한다.
- 이스케이프 처리
네트워크를 통해 정보를 공유할 때 어떤 시스템에서도 읽을 수 있는 ASCII Character-set로 변환하는 것이다. UTF-8 특수문자의 경우, 1문자당 1~3byte, UTF-8 한글 표현의 경우, 1문자당 3btye이다. 예를 들어 특수문자 공백(space)은 %20, 한글 ‘가’는 %EC%9E%90으로 인코딩된다. - 이스케이프 처리 이유
URI 문법 형식 표준 RFC3986에 따르면 URL은 ASCII Character-set으로만 구성되어야 하며 한글을 포함한 대부분의 외국어나 ASCII에 정의되지 않은 특수문자의 경우 URL에 포함될 수 없다. 따라서 URL 내에서 의미를 갖고 있는 문자(%, ?, #)나 URL에 올 수 없는 문자(한글, 공백 등) 또는 시스템에 의해 해석될 수 있는 문자(<, >)를 이스케이프 처리하여 야기될 수 있는 문제를 예방하기 위함이다.
단 알파벳, 0~9의 숫자, - _ . ! ~ * ‘ ( ) 등은 이스케이프 처리에서 예외이다. - decodeURI()은 매개변수로 전달된 URI을 디코딩한다.
encodeURI(URI)
// URI: 완전한 URI
decodeURI(encodedURI)
// encodedURI: 인코딩된 완전한 URI
var uri = 'http://example.com?name=이웅모&job=programmer&teacher';
var enc = encodeURI(uri);
var dec = decodeURI(enc);
console.log(enc);
// http://example.com?name=%EC%9D%B4%EC%9B%85%EB%AA%A8&job=programmer&teacher
console.log(dec);
// http://example.com?name=이웅모&job=programmer&teacher
2-2-7. encodeURIComponent() / decodeURIComponent()
- encodeURIComponent()은 매개변수로 전달된 URI(Uniform Resource Identifier) component(구성 요소)를 인코딩한다. 여기서 인코딩이란 URI의 문자들을 이스케이프 처리하는 것을 의미한다. 단 알파벳, 0~9의 숫자, - _ . ! ~ * ‘ ( ) 등은 이스케이프 처리에서 제외이다.
- decodeURIComponent()은 매개변수로 전달된 URI component(구성 요소)를 디코딩한다.
- encodeURIComponent()는 인수를 쿼리 스트링의 일부라고 간주한다. 따라서 =, ?, &를 인코딩한다. 반면 encodeURI()는 인수를 URI 전체라고 간주하며 파라미터 구분자인 =, ?, &를 인코딩하지 않는다.
var uriComp = '이웅모&job=programmer&teacher';
enc = encodeURIComponent(uriComp);
dec = decodeURIComponent(enc);
console.log(enc);
// %EC%9D%B4%EC%9B%85%EB%AA%A8%26job%3Dprogrammer%26teacher
console.log(dec);
// 이웅모&job=programmer&teacher
Author And Source
이 문제에 관하여(poiemaweb / javascript스터디 7), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@candyroom136/poiemaweb-javascript스터디-7저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)