poiemaweb / javascript스터디 7

8954 단어 스터디스터디

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가 구성된 후에 구성된다.

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)

전역 프로퍼티는 전역 객체의 프로퍼티를 의미한다. 애플리케이션 전역에서 사용하는 값들을 나타내기 위해 사용한다. 전역 프로퍼티는 간단한 값이 대부분이며 다른 프로퍼티나 메소드를 가지고 있지 않다.

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

좋은 웹페이지 즐겨찾기