참조타입

2014. 10. 17. 17:29 나홀로스터디/JS For Web Dev


5장 참조타입

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
객체로 작업하기
배열 생성하고 조작하기
자바스크립트의 데이터 타입 이해
원시 데이터 및 원시 래퍼로 작업하기


참조 값(객체)이란 특정 '참조타입'의 인스턴스이다.
참조타입은 데이터와 기능을 묶는 구조로 객체가 가져야 할 프로퍼티와 메서드를 정의한다는 점때문에 '객체정의'라고 불리기도 한다.

생성자는 객체를 생성하는 함수로 객체를 생성할 때는 new 연산자 뒤에 '생성자'를 쓴다.

var person = new Object();


이 코드는 참조타입 Object 의 인스턴스를 생성해서 변수 person에 할당한다.
생성자는 Object()이며, 기본 프로퍼티와 메서드만 가진 단순한 객체를 생성했다.




5.1 Object 타입
참조-값 형태의 Object 타입은 Object의 인스턴스에 많은 기능이 들어있지는 않지만 애플리케이션에 사용할 데이터를 저장하고 전송하는 목적에 안성맞춤이다.

Object 의 인스턴스를 명시적으로 생성하는 방법은 두가지가 있는데 첫번째는 new 연산자와 Object 생성자를 함께 쓰는 방법이고

var person = new Object();

person.name = "Nicholas";
person.age = 38;

다른 방법은 '객체 리터럴' 표기법이다.

ver person = {
  name: "Nicholas",
  age: 28
}

객체 리터럴 표기법을 쓸때 중괄호 안쪽을 빈 공간으로 남겨두면 생정자를 썼을때와 마찬가지로 기본 프로퍼티만 가진 객체를 만들수 있다.

var person = {}; // new Object()와 동일

객체리터럴 표기법을 사용해 객체를 생성할 때는 Object 생성자를 호출하지 않는다.
Object 의 인스턴스는 둘 중 어떤 방법으로 만들어도 상관없지만 객체 리터럴 표기를 쓰면 양이 줄어들고 옵션 매개변수를 여러개 넘길때 많이 사용한다.

객체 프로퍼티는 다른 객체 지향 언어와 마찬가지로 '점 표기법'을 써서 접근하지만 '대괄호 표기법'을 쓸수도 있다.

console.log(person["name"]);
console.log(person.name);

두방법의 차이는 없지만 대괄호 표기법의 장점은 변수를 써서 프로퍼티에 접근할 수 있다는 점이다.

var propertyName = "name";
console.log(person[propertyName]);

프로퍼티 이름에 공백이 있거나 알파벳이나 숫자가 아닌 문자를 써야하는 경우 점 표기법으로는 접근할수 없으므로 대괄호 표기법이 필요하다.

 

5.2 Array 타입
데이터의 순서 있는 목록이라는 점은 다른 언어의 배열과 마찬가지지만 ECMAScript 의 배열 슬롯에는 어떤 타입의 데이터라도 넣을수 있다.

배열은 두가지 방법으로 만드는데 첫번째는 Array 생성자를 쓰는 방법이고 배열에 데이터가 몇개 들어갈지 알고 있다면 생성자에 매개변수를 넘겨서 length 프로퍼티가 자동으로 그 값에 맞게 바뀌게 하면 된다. Array 생성자를 쓸때 new 연산자는 생략이 가능하다.

var color = new Array();
var color = new Array(20); // 데이터가 20개 있는 배열 생성
var color = new Array("red", "blue", "green"); // 문자열이 3개 있는 배열 생성

배열을 생성하는 두번째 방법은 '배열 리터럴' 표기법으로 대괄호 안에 데이터를 쉼표로 구분해 쓰는 방법이다.

var color = ["red", "blue", "green"];  // 문자열이 3개 있는 배열 생성 var name = []; // 빈배열 생성

console.log(color[0]); // 첫번째 데이터 표시 color[2] = "block" // 세번째 데이터 값 변경

배열값에 접근하려면 대괄호 안에 인덱스를 넣으면 된다.
length 프로퍼티는 배열에 저장된 데이터의 개수인데 항상 0 이상의 값을 반환하고 length 프로퍼티의 값을 바꾸면 배열 길이가 그에 맞게 바뀌면서 데이터를 제거하거나 빈 슬롯을 추가한다.
length 프로퍼티는 배열 마지막에 데이터를 추가할때도 유용하게 사용된다.

color[color.length] = "black" // 마지막 슬롯 인덱스 다음에 데이터 추가




5.2.1 배열감지
객체와 배열을 구분하기 쉽지 않은데 전역 스코프가 하나뿐인 단순한 웹 페이지에서는 instanceof 연산자를 쓴다. 하지만 instanceof 연산자는 실행 컨텍스트가 하나뿐이라고 가정하는 문제가 있다.

if(value instanceof Array){
  // 배열일때 실행하는 코드
} 

ECMAScript 5에서는 이 문제를 우회하기 위해 Array.isArray() 메서드를 제공하고 IE9이상, FF4이상, Safari5이상,Opera10.5 이상, Chrome 에서 지원한다.

if(Array.isArray(value)){   // 배열일때 실행하는 코드 }




5.2.2 변환 메서드
객체에는 모두 toLocaleString(), toString(), valueOf() 메서드가 있다.
배열의 각 슬롯을 쉼표로 구분한 문자열을 반환하는데 배열에서 toString()과 valueOf()는 같은 값을 반환한다.
join() 메서드를 통해 구분자가 될 문자열을 입력할수 있다.

alert(배열이름)는 매개변수로 문자열을 받으므로 먼저 배열에서 toString() 을 호출하고 따라서 toString()을 명시적으로 호출한것과 같은 결과가 나타난다.

배열에서 join(), toLocaleString(), toString(),valueOf() 메서드를 호출했을 떄 null이나 undefined 인 데이터는 빈 문자열로 표시된다.

 

5.2.3 스택 메서드
배열객체는 데이터 삽입과 제거에 제한이 있는 데이터 구조인 스택(LIFO last-in-first-out)처럼 동작할수 있다.
스텍에서 데이터 삽입(push)와 제거(pop)는 단 한지점에서만 발생하는데 ECMAScript 배열에는 push() 와 pop() 메서드가 있어서 마치 스택처럼 마지막에 추가된 데이터가 삭제되고 추가된다.

push() 메서드는 받은 매개변수 그대로 배열에 추가한 후 이에 맞게 늘어난 배열 길이를 반환한다.
pop() 메서드는 배열의 마지막 데이터를 제거하고 length 프로퍼티를 그에 맞게 줄여서 반환한다.

 

5.2.4 큐 메서드
큐는 목록 마지막에 데이터를 추가하며 목록 맨 앞에서 데이터를 꺼낸다.
push()메서드는 배열 마지막에 데이터를 추가하므로 shift()를 사용하면 큐처럼 동작할수 있게 된다.
unshift() 와 pop() 을 조합하면 큐의 반대 배열 처음에 데이터를 추가하고 앞에서 꺼내는 방식으로 쓸수 있다.

 

5.2.5 정렬 메서드
배열 순서를 직접 조작하는 메서드는 reverse()sort() 두가지인데 이름에서 예상하듯 reverse() 메서드는 단순히 배열에 저장된 데이터 순서를 뒤집을때 사용하나 유연성은 없다.
배열의 데이터 순서를 마음대로 조작하기 위해서는 sort() 메서드가 필요한데 sort() 메서드는 가장 작은 값이 앞에오고 가장 큰 값이 뒤에 오도록 정렬한다.
이를 위해 이면에서  String() 함수를 호출해 데이터를 문자열로 변환한 후 정렬하고 비교함수를 넘겨서 순서를 조절할 수 있다.

reverse() 와 sort() 는 모두 자신을 호출한 배열에 대한 참조를 반환한다.

 

5.2.6 조작 메서드
concat() 메서드는 현재 배열 데이터를 기반으로 새로운 배열을 만드는 것으로 현재 배열을 복사한 다음 메서드의 매개변수를 새 배열 마지막에 추가해서 반환한다.배개변수를 넘기지 않으면 현재 배열의 복사본을 반환한다.

slice() 메서드는 배열에 포함된 데이터 일부를 가진 새 배열을 만든다.
slice() 메서드는 매개변수를 두개 받는데 각 매개변수는 원래 배열에서 가져올 데이터 범위의 시작과 끝을 나타내어 첫번째 매개변수에 해당하는 인덱스부터 두번째 매개변수에 해당하는 인덱스 바로 앞까지 가져오고, 매개변수를 하나만 넘기면 해당 인덱스에서 끝까지 모든 데이터를 가져온다.

slice() 에 배개변수로 음수를 넘기면 배열길이 해당값을 더한 숫자를 사용하고 두번째 매개변수가 첫번재 매개변수보다 작으면 빈 배열을 반환한다.

splice() 메서드는 배열 중간에 데이터를 삽입하는 것인데 세가지 방법으로 사용한다.


splice() 메서드는 항상 원래 배열에서 삭제한 데이터의 배열을 반환하는데 삭제한 것이 없다면 빈 배열을 반환한다.

 

5.2.7 위치 메서드
ECMAScript 5 에서는 배열에 indexOf()와 lastIndexOf() 두 위치 메서드가 추가되었다.
이들 메서드는 매개변수를 두개 받는데 첫번째는 검색할 데이터이며 두번째는 검색을 시작할 인덱스이다.
indexOf()메서드는 배열의 처음부터 마지막까지 검색하고, lastIndexOf()메서드는 배열의 마지막에서 처음까지 검색한다.

데이터 검색은 === 연산자로 비교하고 두 메서드는 찾아낸 데이터의 인덱스를 반환하는데 찾지 못한 경우 -1을 반환한다.

 

5.2.8 반복 메서드
이들 메서드는 모두 매개변수를 두 개 받는데 하나는 배열의 각 데이터에서 실행할 함수이며 하나는 함수를 실행할 스코프 객체이다.

every() -  배열의 모든 데이터에서 콜백 함수를 호출하고 반환값이 전부 ture면 true를 반환한다.
filter() - 배열의 모든 데이터에서 콜백함수를 호출하고 반환값이 true인 데이터를 새 배열에 저장하여 반환한다.
forEach() - 배열의 모든 데이터에서 콜백함수를 호출한다 .반환값이 없다
map() - 배열의 모든 데이터에서 콜백함수를 호출하고 그 결과를 새 배열에 저장하여 반환한다
some() - 배열의 모든 데이터에서 콜백함수를 호출하고 반환 중 하나라도 true면 true를 반환한다.

 

5.2.9 감소 메서드
reduce() 메서드는 배열의 첫 번재 데이터에서 시작해 마지막까지 진행하고 reduceRight()는 반대로 마지막 데이터에서 시작해 첫 번째까지 진행한다. 두 메서드 모두 두개의 매개변수를 받는데 첫번째 매개변수는 각 데이터에서 실행할 콜백 함수고 두번째 매개변수는 감소 작업을 시작할 초기 값이다.
reduce()와 reduceRight() 의 콜백 함수가 넘겨받는 매개변수는 이전 값, 현재 값, 현재 값의 인덱스, 현재 배열 네가지다.

 

 

5.3 Date 타입
Date 타입은 날짜와 시간을 저장할 때 1970년 1월 1일 자정부터 몇 밀리초가 지났는지 나타내는 숫자를 사용하고 날짜 객체를 생성할 때는 new 연산자 다음에 Date 생성자를 쓴다.

var now = new Date(); 

Date() 생성자에 매개변수를 넘기지 않으면 생성된 객체는 현재 날짜와 시간이 저장된다.
Date.parse() 메서드는 매개변수로 날짜를 표현하는 문자열을 받고 해당 문자열을 날짜의 밀리초 표현으로 변환을 시도한다.

Date.UTC()의 매개변수는 해당 시각의 년, 월 인덱스(0이 1월), 일(1~31), 시(0~23), 분, 초, 밀리초이다.


5.3.1 상속된 메서드
Date 타입도 toLocaleString(), toString(), valueOf() 메서드를 오버라이드 하지만 Date 타입의 toLocaleString() 메서드와 toString() 메서드는 디버그 목적으로 사용하고 valueOf() 메서드는 밀리초 단위로 비교가 가능하다.


5.3.2 날짜 표시 메서드
Date 타입에는 날짜를 특정 형식으로 표현하는 메서드가 있다.

toDateString() - 날짜를 요일, 월, 일, 년 형식으로 표현하고 정확한 형식은 브라우저를 따른다.
toTimeString() - 날짜를 시, 분, 초, 타임존 형식으로 표현하고 정확한 형식은 브라우저를 따른다.
toLocaleDateString() - 날짜를 요일, 월, 일, 년 형식으로 표현하고 정확한 형식은 브라우저를 따른다.
toLocaleTimeSting() - 날짜를 시, 분, 초 타임존 형식으로 표현하고 정확한 형식은 브라우저를 따른다.
toUTCString() - 날짜를 UTC(협정 세계시) 형식으로 표현하고 정확한 형식은 브라우저를 따른다.


5.3.3 날짜/시간 부속 메서드
날짜의 특정 부분을 가져오거나 설정하는데 쓰인다.

 


5.4 RegExp 타입

var expression = /pattern/flags;

패턴 부분에 정규표현식을 나타내는 식을 쓰며, 문자 클래스, 수량자, 그룹, 룩어헤드, 역참조 등이 포함된다.
플래그를 통해 어떻게 동작할지 나타내며 세가지가 있다.

g - 전역모드를 지정한다. 문자열에서 패턴을 찾는 즉시 종료하지 않고 문자열 전체에서 동작한다.
i - 대소문자 비구분 모드를 지정한다. 패턴을 찾을때 대소문자를 구분하지 않는다.
m - 여러줄 모드를 지정한다. 텍스트의 줄 끝에 도달해도 멈추지 않고 계속 패턴을 찾는다.

메타문자를 패턴에 쓸 때는 반드시 역슬래시를 써서 이스케이프 해야한다.

( [ { \ ^ $ | } ] ) ? * + .



5.4.1 정규 표현식 인스턴스 프로퍼티

RegExp 인스턴스에는 다음 프로퍼티가 있으며 각 프로퍼티는 패턴에 대한 정보를 포함한다.

global - g 플래그 설정 여부 불리언 값.
ignoreCase - i 플래그 설정 여부 불리언 값.
lastIndex - 패턴 매칭의 시작 위치를 나타내는 정수 값이며, 항상 0에서 시작한다.
multiline - m 플래그 설정 여부 불리언 값.
source - 정규 표현식을 생성한 문자열. 항상 리터럴 형식으로 반환하되 여닫는 /문자는 포함되지 않는다. 생성자를 통해 생성되었더라도 리터럴 형식으로 반환한다.



5.4.2 정규 표현식 인스턴스 메서드
가장 많이 쓰는 메서드는 그룹을 캡처할 의도로 만들어진 exec() 메서드로 패턴을 테스트할 문자열을 매개변수로 받고 패턴에 일치하는 문자열 배열을 반환하며 일치하는 부분을 찾을 수 없을 때는 null 을 반환한다.
exec() 메서드가 반환하는 배열은 Array의 인스턴스인 동시에 프로퍼티 두개 추가되는데 index 프로퍼티는 패턴이 일치한 위치를 나타내고 input 프로퍼티는 exec() 메서드에 넘긴 문자열이다.

정규 표현식의 또다른 메서드는 test() 인데, 문자열이 패턴에 일치하는 지만 확인하여 일치할 때는 true를 반환하고 그렇지 않을 때는 false를 반환한다.

객체 프로토타입에서 상속한 메서드 toLocaleString() 과 toString()은 리터럴 형식을 반환한다. valueOf() 메서드는 정규 표현식 자체를 반환한다.



5.4.3 RegExp 생성자 프로퍼티
정식이름과 짧은 이름이 있는데 오페라는 짧은 이름을 지원하지 않는다.
짧은 이름은 반드시 대괄호 표기법을 써야한다.


5.4.4 패턴의 한계
ECMAScript의 정규 표현식은 완전히 개발된 상태이지만 펄 같은 언어에서 가능한 고급 정규 표현식 기능에는 미치지 못한다.

 



5.5 Function 타입
모든 함수는 Function 타입의 인스턴스이며 다른 참조 타입과 마찬가지로 프로퍼티와 메서드가 있고 함수 이름은 단순히 함수 객체를 가리키는 포인터가 된다.

보통 함수선언 문법을 통해 정의된다.

function sum (num1, num2){
  return num1 + num2;
}

변수를 정의하면서 함수를 초기화 하는 방법은 함수 이름은 필요하지 않다.(함수 표현식)

var sum = function(num1, num2){
  return num1 + num2;
}; 
 

함수를 정의하는 마지막 방법은 Funtion 생성자를 이용하는 방법으로 매개변수 숫자에는 제한이 없고 마지막 매개변수는 함수 바디로 간주한다.

var sum = new Function("num1", "num2", "return num1 + num2") // 권장하지 않음.



5.5.1 오버로딩 없음
함수 이름이 단순한 포인터임을 이해하면 ECMAScript에서 함수 오버로딩이 불가능한 이유도 이해할 수 있다.


5.5.2 함수 선언 vs 함수 표현식
함수 선언은 실행전에 모든 실행 컨텍스트에서 접근하고 실행할수 있지만 함수 표현식은 코드 실행이 해당 줄까지 진행하기 전에는 사용할 수 없다.

함수 표현식을 쓰면서도 함수 선언처럼 보이게, 즉 var sum = function sum() {}처럼 쓸 수 있다.


5.5.3 값처럼 쓰는 함수
함수이름은 변수일 뿐이므로 함수를 다른 함수에 매개변수로 넘기거나 함수 실행 결과로 다른 함수를 반환하는 일이 가능하다.


5.5.4 함수의 내부구조
함수 내부에는 arguments, this라는 특별한 객체가 있다.
argument 객체는 전달된 매개변수를 모두 포함하는 배열과 비슷한 객체이며 주요 목적은 함수 매개변수를 표현하는 것이지만 arguments 객체의 소유자인 함수를 가리키는 포인터인 calee라는 프로퍼티도 있다.

this 는 함수가 실행 중인 컨텍스트 객체에 대한 참조이다. 함수를 웹페이지의 전역 스코프에서 호출했다면 this 객체는 window를 가리킨다.

caller 프로퍼티는 해당 함수를 호출한 함수에 대한 참조를 저장하며 전역 스코프에서 호출했다면 null이 저장된다.


5.5.5 함수 프로퍼티와 메서드
ECMAScript에서 함수는 객체이므로 프로퍼티와 메서드를 가지는데 모든 함수에 공통인 프로퍼티는 length와 prototype이다.  length 프로퍼티는 함수가 넘겨받을 것으로 예상하는 이름 붙은 매개변수의 숫자이다.
prototype 프로퍼티는 개발자 자신만의 참조 타입과 상속을 정의할 때 매우 중요하며, 열거할수 없는 프로퍼티이므로 for-in문에 나타나지 않는다.

apply()call() 두 가지 메서드는 소유자인 함수를 호출하면서 this를 넘기는데 결과적으로 함수 내부에서 this 객체의 값을 바꾸는 것이나 마찬가지이다.
apply() 메서드는 매개변수로 소유자 함수에 넘길 this 와 매개변수 배열을 받는데 두 번째 매개변수는 Array의 인스턴스일 수도 있고 arguments 객체일 수도 있다.

 

5.6 원시 래퍼 타입
Boolean, Number, String은 원시 값을 편리하게 조작하기 위해 디자인된 참조타입이다.
원시 값을 읽을 때마다 이에 해당하는 래퍼 타입이 이면에서 생성되므로 메서드를 사용할수 있다.
new 연산자를 사용해 참조 타입의 인스턴스를 만들면 스코프를 벗어날 때까지 메모리에 존재하지만 자동으로 생성된 원시 래퍼 타입은 코드의 해당 행을 벗어나는 즉시 파괴된다. 따라서 원시 래퍼 타입에는 런타임에 프로퍼티나 메서드를 추가할 수 없다.

원시래퍼 타입에  typeof를 대입하면 "object"를 반환하며 원시 래퍼 객체는 모두 불리언 값인 true로 변환된다.

Object 생성자에 문자열을 넘기면 String 인스턴스가 생성되며 숫자를 넘기면 Number 의 인스턴스가, 불리언을 넘기면 Boolean 인스턴스가 생성되는데 new를 사용해 원시 래퍼 생성자를 호출한 것과 같은 이름의 형변환 함수를 호출한 결과는 다르다.


5.6.1 불리언 타입
Boolean 타입은 불리언 값에 대응하는 참조 타입으로 객체를 생성하기 위해서는 Boolean 생성자에 ture나 false를 넘긴다.

var booleanObject = new Boolean(ture); 

Boolean 인스턴스는 원시 값 true나 false를 반환하도록 valueOf() 메서드를 오버라이드한다.


5.6.2 Number 타입
Number타입은 숫자형 값의 참조타입으로 Number 객체는 Number 생성자에 숫자를 넘겨 생성한다.

var numberObject = new Number(10); 

Number 타입에는 상속받은 메서드 외에도 숫자를 다양한 형식의 문자열로 반환하는 메서드가 있다.
toFixed() 메서드는 매개변수로 지정한 만큼의 정확도로 소수점을 찍은 문자열을 반환하고 지정한 자리수보다 크다면 반올림한다.

toExponential() 메서드는 숫자를 지수 표기법 문자열로 반환한다.
toPrecision() 메서드는 자신을 호출한 객체의 숫자형 값에 따라 toFixed()나 toExponentiol() 중 하나를 호출하여 지수 표기법이나 소수점 표기법을 선택하여 반환한다.


5.6.3 String 타입

var stringObject = new String("Hello world"); 

String 객체의 메서드는 모두 원시 문자열에서 사용할수 있다.
String 인스턴스는 모두 length 프로퍼티가 있는데 이 프로퍼티에는 문자열 길이를 나타내는 숫자가 저장된다.

글자 메서드
문자열의 특정 문자에 접근하는 메서드는 charAt()charCodeAt() 두 가지이고 각 메서드는 매개변수 하나를 받는데 이는 원하는 문장의 인덱스이다.
특정 문자를 호출할때는 charAt() 메서드를 사용하고 문자 자체가 아니라 문자 코드가 필요할 때는 charCodeAt()을 사용한다.


문자열 조작 메서드
concat() 메서드는 문자열을 병합하여 그 결과를 반환하며 매개변수 숫자에 제한이 없다.
하지만 문자열을 합칠때는 + 연산자가 더 많이 쓰이며 더 빨리 동작한다.

ECMAScript 에는 문자열 일부로 새 문자열을 만드는 메서드가 slice(), substr(), substring() 세가지가 있다.
slice()와 substring() 에서는 두번째 매개변수 직전까지의 문자를 가져오고, substr()에서는 두번째 매개변수가 문자를 몇개 가져올지 나타낸다. 두번째 매개변수를 생략하면 열 전체 길이가 기본 값으로 사용된다.


문자열 위치 메서드
문자열의 위치를 찾는 메서드는 indexOf()와 lastIndexOf() 두가지가  있는데 문자열을 검색해 그 위치를 반환하며 찾지 못핬을때는 -1을 반환한다. 두 메서드의 차이는 indexOf()가 문자열 처음에서 검색을 시작하는 반면 lastIndexOf()는 문자열 마지막막에서 검색을 시작한다.


trim() 메서드
trim() 메서드는 문자열을 복사한 후 앞뒤 공백을 모두 제거한 결과를 반환한다.


대소문자 메서드
toLowerCase(), toLocaleLowerCase(), roUpperCase(), toLocaleUpperCase() 네가지 메서드가 있는데 일부 언어에서는 대소문자 변환에 따른 특별한 규칙이 필요하며 이 때문에 지역 메서드가 필요하다. 일반적으로 작성한 코드가 어느 지역에서 실행될지 모른다면 지역 메서드를 쓰는 편이 안전한다.

문자열 패턴 매칭 메서드
String 타입에는 문자열 내에서 패턴 매칭을 하도록 만들어진 메서드가 몇가지 있는데 가장 많이 쓰이는 메서드는 match()로 RegExp 객체의 exec() 메서드와 같은 결과를 반환한다.
match() 메서드는 매개변수로 정규 표현식 리터럴이나 RegExp 객체를 하나 받는다.

serch() 메서드는 패턴에 일치하는 첫번째 문자열 인덱스를 반환하며 일치하는 것을 찾지 못했을 때는 -1을 반환한다. 항상 문자열 처음에서 검색을 시작한다.

replace() 는 문자열 일부를 바꾼다.
매개변수를 두개 받는데 첫번째 매개변수는 RegExp 객체 또는 문자열이고 두번째 매개변수는 문자열 또는 문자열을 반환하는 함수이다.

htmlEscape() 함수는 HTML에서 사용할 수 있도록 특수문자를 이스케이프하게 만들었다.
HTML에서 <,  >,  &,  "  문자를 그대로 쓸수 없으므로 반드시 이스케이프해야 한다.

split() 메서드는 텍스트를 구분자를 기준으로 분리해서 배열에 담아 변환한다.

localeCompare() 메서드
문자열 두 개를 비교한 후 세가지 값 -1. 0. 양수(대부분1) 중 하나를 반환한다.  메서드를 호출하는 텍스트가
매개변수로 넘긴 문자열보다 알파벳 순서상 뒤에있다면 -1
매개변수 문자열이 일치하면 0
매개변수로 넘긴 문자열보다 알파벳 순서상 앞에 있다면 1

fromCharCode() 메서드
문자 코드를 받아 문자열로 변환하는것으로 charCodeAt() 메서드가 하는 일을 거꾸로 한다고 생각하면 된다.

HTML() 메서드
자바스크립트에서 동적으로 HTML 형식을 생성할 필요가 있지만 이 메서드를 쓰면 시멘틱 마크업을 해치므로 거의 사용하지 않는다.

 

5.7 내장된 싱글톤 객체

5.7.1 Global 객체
Global 객체는 명시적으로 접근할수 없다는 점에서 가장 독특한 객체이다.
ECMA-262는 Global 객체를 소유자가 없는 모든 프로퍼티와 메서드를 담는 객체로 정의한다. 사실 전역 변수나 전역 함수라는 것은 존재하지 않는다. 전역에서 정의한 변수와 함수는 모두 Global 객체의 프로퍼티가 된다.

 
URI 인코딩 메서드
encodeURI() 와 encodeURIComponent() 메서드는 브라우저에 전달할 URI를 인코드하는 메서드이다.
URI 인코딩 메서드는 특별한 UTF-8 인코딩을 써서 URI에 사용할 수 없는 문자를 브라우저가 인식하고 이해할수 있는 문자로 바꿔준다.

encodeURI() 메서드는 전체 URI에 대해 작업하도록 만들어졌고 : 이나 /,  ?,  #처럼 URI의 일부분으로 쓰이는 특수 문자는 인코드 하지 않지만 encodeURIComponent() 메서드는 비표준 문자를 모두 인코드 한다.

decodeURI()와 decodeURIComponent()는 반대의 역할을 한다.


eval() 메서드
eval() 메서드는 ECMAScript 인터프리터 자체인 듯 동작하며 매개변수로 문자열을 하나 받는데 이 문자열은 실행할 수 있는 ECMAScript 코드여야 한다.

eval("alert('hi");
alert("hi");

인터프리터가 eval()을 만나면 매개변수를 실제 ECMAScript 문장으로 해석해서 eval() 이 있던 위치에 삽입한다. eval()이 실행하는 코드는 eval()을 호출한 실행 컨텍스트의 일부분으로 간주되며 해당 컨텍스트와 같은 스코프 체인을 갖는다.

문자열을 코드로 변환하는 eval()을 쓸때는 항상 주의해야하며 사용자가 악의적으로 보안을 해치는 값을 입력할수 있기 때문에 eval()을 쓸때는 특히 더 조심해야 한다.


Global 객체의 프로퍼티
특별한 값인 undefined, NaN, Infinity외에 네이티브 참조 타입 생성자인 Object나 Function 등도 Global 프로퍼티다.
ECMAScript 5판에서는 undefined, NaN, Infinity에 값을 할당할 수 없음을 명확히 했다. 이들에 값을 할당하려 하면 스트릭트 모드가 아닐 때에도 에러가 난다.


window 객체
웹브라우저에서는 window 객체를 통해 global객체에 접근 할 수 있다.
즉 전역 스코프에서 선언한 변수와 함수는 모두 window 객체의 프로퍼티가 된다.


5.7.2 Math객체
수학 공식과 각종 상수를 Math 객체에 저장한다.

Math 객체의 프로퍼티
Math 객체의 프로퍼티는 대부분 수학에서 쓰이는 특별한 상수이다.


min() 과 max() 메서드
min(), max() 메서드는 한 그룹의 숫자중에서 가장 작은 숫자와 가장 큰 숫자를 찾는다.

배열 데이터 중에서 최대값이나 최소값을 찾을 때는 apply() 메서드를 쓸 수 있다.

var values = [1, 2, 3, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values); 

이 테크닉의 요점은 apply() 의 첫 번째 매개변수로 Math 객체를 넘겨서 this가 정확히 설정되도록 하는것이다.


반올림 메서드
소수점 있는 값을 정수로 바꾸는 반올림 메서드는 Math.ceil()은 올림, Math.floor()는 내림, Math.round()는 반올림이다.


random() 메서드
Math.random() 메서드는 0과 1 사이의 난수를 반환하되 0이나 1을 반환하지는 않는다.

number = Math.floor(Math.random() * total_number_of_choices + first_possible_number)

경우의 수를 세는 것보다 범위만 제공하여 그 사이의 난수를 반환하는 함수를 만드는것이 편하다

 function selecForm(lowerValue, upperValue) {
    var choices = upperValue - lowerValue + 1;
    return Math.floor(Math.random() * choices + lowerValue);
}
var num = selectForm(2,10);
alert(num); // 2와 10사이의 난수. 2와 10을 포함 
var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"]; var color = colors[selectFrom(0, colors.length-1)];

 

'나홀로스터디 > JS For Web Dev' 카테고리의 다른 글

브라우저 객체모델  (0) 2014.11.12
함수 표현식  (0) 2014.10.23
객체에 대한 이해  (0) 2014.10.15
변수와 스코프, 메모리  (0) 2014.10.07
언어의 기초  (0) 2014.10.01
Copyright © HuckleberryM All Rights Reserved | JB All In One Designed by CMSFactory.NET