'나홀로스터디'에 해당되는 글 27건

참조타입

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

문장

2014. 10. 16. 13:56 나홀로스터디/JS 완벽가이드


6장 문장

이 포스팅은 "자바스크립트 완벽 가이드(인사이트, 송인철,이동기,이유원,황인석 옮김)"에서 발췌 요약한 것입니다.
 
6.1 표현문
6.2 복합문
6.3 if/else
6.4 else if
6.5 switch
6.6 while
6.7 do/while
6.8 for
6.9 for/in
6.10 레이블
6.11 break
6.12 continue
6.13 var
6.14 function
6.15 return
6.16 throw
6.17 try/catch/finally
6.18 with
6.19 빈문장


표현식이란 평가되어 어떤 값을 내줄 수 있는 자바 스크립트 구절이다.



6.1 표현문
할당문이 표현문에 속한다.

 i += 3;



++ 와 -- 같은 증감 연산자들은 변수값을 바꾼다는 부수 효과가 있는데 이는 할당이 일어난 것 같은 효과를 보인다.

 counter++;



delete 연산자는 객체 프로퍼티를 삭제하므로 문장으로서 쓰이는게 대부분이다.

 delete o.x;



표현문의 다른 주요 부류로 함수 호출이 있다.

window.close();

 
 


6.2 복합문
하나의 표현식 안에 다수의 표현식을 합칠 때에는 쉼표 연산자를 사용하는데 자바스크립트에서는 하나의 문장에 다수의 문장을 합칠 수 있는 방법도 제공한다. (문장 블록이라고도 부른다)

 {
 x = Math.PI;
 cx = Math.cos(x);
 allert("cos( " + x + " ) = " + cx);
 } 

자바스크립트 인터프리터가 복합문의 모든 문장을 실행한다.
간혹 복합문의 실행 도중 중단되는 것은 복합문 안에 break, continue, return, throw 문장이 있을때 일어난다.


 

6.3 if/else
조건부로 문장을 실행할 수 있는 기능을 제공하는 기본적인 제어문으로 어떤 조건의 테스트 결과에 따라 둘 중 하나의 코드를 실행하며  형태는 다음과 같다.

if(표현식){
  문장1
} else {
  문장2
}

 


6.4 else if
여러조건의 코드를 실행하기 위한 방법으로 else if문이 있다.

 


6.5 switch
switch문이 실행되면 '표현식'의 값을 계산하고 이 값에 대응하는 case레이블을 찾는다.  올바른 레이블을 찾으면 case 레이블 직후에 나오는 문장을 실행하고 찾지 못하면 특수 레이블인 default: 레이블 직후의 첫번째 문장을 실행한다. 하나의 case 문에는 하나의 break문을 삽입하는 것을 잊지 말아야 한다.

switch(표현식){
  case 1: 
    코드 블록 #1 실행
    break;
  case 2: 
    코드 블록 #2 실행
    break;
  defailt:
    코드 블록 #3 실행
    break;
} 

대응하는 case를 판별하는 데에는 동등 연산자(==)가 아닌 일치 연산자(===)가 사용된다.




6.6 while
while문은 기본적인 반복문으로서 자바스크립트로 하여금 반복적인 행동을 수행할 수 있게 한다.

while(표현식){
  문장
} 

먼저 표현식을 평가한후 그 값이 true이면 while루프의 몸체를 형성하는 문장이 실행되고 표현식이 다시 평가되는데 이것은 표현식이 'false'로 평가됟때까지 반복된다.

 


6.7 do/while
do/while 루프는 while루프와 비슷하지만 루프 표현식이 테스트되는 곳이 처음이 아니라 마지막이므로 최소 한번은 루프 몸체가 실행된다.

do{
  문장
}while(표현식);

루프 조건을 명시하며 끝나기 때문에 while문과 다르게 세미콜론을 붙인다.

 



6.8 for
이 변수는 시작하기전 초기화되고 표현식을 평가하고 루프 몸체의 끝에서 표현식이 다시 평가되기 직전에 카운터 변수가 증가되거나 갱신된다.

for(초기화; 테스트; 증가){
  문장
}
 

자바스크립트는 '초기화' 자리에 var에 의한 변수 선언문도 허용하고 있기 대문에 루프 카운터를 선언하는 동시에 초기화할 수도 있다.
'테스트' 표현식은 매회 반복이 일어나기 직전에 평가되며 루프의 몸체를 실행할지 여부를 제어하는데 표현식이 true이면 루프 몸체의 '문장'이 실행된다.
'증가' 표현식은 할당 표현식이거나 ++나 -- 연산자를 사용하는 표현식이다.

 


6.9 for/in
배열의 모든 원소에 대하여 루프를 돌리려면 간단히 인덱스 변수를 증가시키면서 while 이나 for 루프를 돌리면 된다.
for/in 문은 객체의 모든 프로퍼티에 대해 루프를 돌리는 방법을 제공한다.

for (변수 in 객체){
  문장
} 


'변수'는 변수이름 또는 변수/배열 객체/객체 프로퍼티를 선언하는 var문이어야 한다.
'객체'는 객체이름 또는 객체로 평가될수 있는 표현식이어야 한다.
'문장'은 루프의 몸체를 구성하는 문장 또는 문장 블록이어야 한다.

for/in 루프에서 객체 프로퍼티들이 변수에 할당되는 순서는 정해져있지 않고 사용자 정의 프로퍼티들과 상속된 사용자 정의 프로퍼티는 모두 열거되지만 많은 수의 내장 프로퍼티는 열거되지 않는다.

 


6.10 레이블
어떤 문장에라도 그 앞에 식별자 이름과 콜론을 삽입함으로써 레이블을 붙일 수 있다.

 식별자: 문장

예약어를 제외한 모든 적법한 자바스크립트 식별자는 '식별자'가 될 수 있고 레이블 이름은 변수나 함수 이름과는 전혀 별개로 취급되므로 충돌을 걱정할 필요는 없다.
어떤 문장에 레이블을 붙이면 프로그램의 다른 곳에서 그문장을 참조할 수 있는 이름이 생기는 것이다.
레이블을 붙이는 문장은 while, do/while, for, for/in과 같은 루프뿐이다.

 



6.11 break
break의 역할은 루프나 switch에서 빠져나오게 하는것이므로 break문을 사용하는 것은 오직 루프나 switch문에서만 적법하다.
자바스크립트에서는 break 키워드 뒤에 레이블 이름이 따라올 수 있는데 break와 레이블 사이에서 줄을 나누면 세미콜론을 자동 삽입하는 특징때문에 줄바꿈이 허용되지 않는다.

 



6.12 continue
continue문 역시 레이블과 함께 쓰일수 있는데 단독형식과 레이블에 상관없이 항상 while, do/while, for, for/in 루프의 몸체 내부에서 사용되어야만 한다.
이 구문이 실행되면 이를 감싸고 있던 루프의 현재 반복을 종료하고 다음 반복을 시작하는데 이때 루프의 종류에 따라 다른일이 일어난다.

- while : 시작부분에 지정된 '표현식'을 다시 테스트하고 결과가 true이면 루프 몸체부터 다시 실행한다.
- do/while : 일단 루프의 끝부분까지 건너뛰고 다시 테스트하여 결과가 true이면 루프 몸체부터 다시 실행한다.
- for : '증가'표현식을 평가한 후 '테스트' 표현식을 테스트하여 다음 반복 수행을 결정한다.
- for/in : 다음 차례의 프로퍼티 이름을 루프 시작에서 지장된 변수에 할당한 후 다시 시작한다.

while 루프는 루프 조건으로 곧장 귀환하는 반면 for 루프는 일단 '증가' 표현식을 평가한 후에 루프 조건으로 귀환한다.

 



6.13 var
var문은 명시적으로 하나 또는 그 이상의 변수를 선언하는데 쓰인다.

 var 이름_1[ = 값_1] [ , .... , 이름_n[ = 값_n]] 

함수 내부에서 사용되는 var 문은 해당 함수의 호출 객체에 주어진 변수 이름의 프로퍼티를 생성함으로써 변수를 정의하고 함수 외부에서 나타난것이라면 전역 객체에 마찬가지로 프로퍼티를 생성함으로써 변수를 정의한다.
var 문에 의해 생성되는 프로퍼티는 delete 연산자로 삭제될 수 없고 변수에 초기값을 지정하지 않으면 변수 정의는 되지만 초기값은 undefined가 된다.

 



6.14 function
fonction문은 자바스크립트 함수를 정의하는데 쓰인다.

function 함수 이름([전달인자1[전달인자2[..., 전달인자n]]]){
  문장  
}


함수 몸체는 임의 개수의 자바스크립트 문장으로 구성되고 중괄호를 사용하여 문장들을 묶는다.
이 문장들은 함수가 정의 될때 실행되는것이 아니고 실행 연산자()에 의한 함수 호출로 이 함수가 컴파일되고 실행될 수 있는 형태의 새로운 함수 객체와 연결되었을때 실행된다.

함수를 정의할 때 다른 함수 정의 속에 중첩시킬수 있는데 if문, while문, 기타 문장 속에는 함수 정의가 위치할수 없다.
자바스크립트 프로그램에서 문장은 동적인 행위를 일으켜야 하는데 함수 정의의 function 문은 정적인 구조를 나타내므로 원칙적으로는 문장이 아니다.
함수는 자바스크립트 코드가 실제로 실행되기 이전의 파싱 또는 컴파일 단계에서 정의된다.
자바스크립트 파서가 함수 정의를 만나면 함수 몸체를 이루는 문장들을 파싱하고 저장한다.(실행하지 않는다)
그리고나서 이 함수를 유지할 프로퍼티를 이 함수와 동일한 이름으로 정의한다.

 



6.15 return
return문은 함수 호출 표현식의 값, 즉 함수에서 반환되는 값을 지정하는데 쓰이므로 함수 몸체 내부에서만 나타날 수 있다.

return 표현식; 

함수에서 '표현식'이 없는 return문을 실행하거나 함수 몸체 끝에서 함수가 반환된다면 해당 함수의 표현식의 값은 undefined가 된다.

 


6.16 throw
'예외'란 무언가 예외적인 상황이나 에러가 발생했음을 가리키는 신호로 예외를 '발생시키다(throw)'라는 것은 그런 에러나 예외 상황을 알린다는 뜻이고 예외를 '잡아내다(catch)'라는 것은 그것을 처리한다는 뜻이다.
자바스크립트에서는 런타임 에러가 일어날 때마다 예외를 발생시키고 프로그램에서 throw문을 사용하여 명시적으로 예외를 발생시킬수도 있다.

throw 표현식; 

'표현식'의 결과값 타입은 무엇이든 될수 있지만 대부분 타입은 Error 객체 또는 Error 하위 클래스 중 하나의 인스턴스가 되곤한다.

 



6.17 try/catch/finally
try/catch/finally 문은 자바스크립트 예외 처리 기법이다.
try 절은 처리할 예외가 발생할지도 모를 코드 블록을 정의하는 역할을 하고 catch 절은 try 블록 내부에서 예외가 발생하는 경우 호출되는 문장 블록이다. finally 블록은 try 블록에서 일어난 일에 관계없이 항상 실행이 보장되어야할 뒷정리용 코드가 포함된다.
catch나 finally 블록은 생략할 수 있지만 try 블록은 catch나 finally 중 적어도 하나 이상의 블록과 함께 사용되어야만 한다.

 


6.18 with

with 문은 유효 범위 체인(변수 이름 판별을 위해 순서대로 검색되는 객체 리스트)을 임시로 변경할때 쓰인다.

with(객체)
문장

with에 의해 추가된 객체는 일시적으로 유효 범위 체인의 일부가 되기때문에 실제 코딩에서 with문을 사용하면 많은 양의 타이핑을 절약할 수 있다

 폼접근법

frames[1].document.forms[0].address.value

 with(frames[1].document.forn[0]){     name.value ="";     adress.value="";     email.value="";  }


with를 사용하는 자바스크립트 코드는 최적화가 어렵기 때문에 코드가 느리게 실행될 수 있으므로 아래와 같은 방법을 추천한다.

var form = frame[1].document.forms[0];
form.name.value = "";
form.address.value = "";
form.email.value = "";



6.19 빈문장
빈문장은 몸체가 없는 루프를 생성할때 유용하게 쓰인다.

 


6.20 자바스크립트 문장 요약


 

'나홀로스터디 > JS 완벽가이드' 카테고리의 다른 글

함수  (0) 2014.10.27
객체와 배열  (0) 2014.10.20
표현식과 연산자  (0) 2014.10.13
변수  (0) 2014.10.07
데이터 타입과 값  (0) 2014.10.01

객체에 대한 이해

2014. 10. 15. 16:08 나홀로스터디/JS For Web Dev


6장 객체에 대한 이해

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
6.1.1 프로퍼티타입
6.1.2 다중 프로퍼티 정의
6.1.3 프로퍼티 속성 읽기


객체지향(Object-oriented) 언어는 일반적으로 클래스를 통해 같은 프로퍼티와 메서드를 가지는 객체를 여러개 만드는 특징이 있는데 ECMAscript는 객체를 "프로퍼티 순서 없는 컬렉션이며 각 프로퍼티는 원시 값이나 객체, 함수를 포함한다" 는 것이다.
이것은 객체가 특별한 순서없이 값의 배열이라는 의미로 ECMAscript객체를 이름-값 쌍의 그룹이며 각 값은 데이터나 함수가 되는 해시 테이블이라고 이해하면 된다.

객체를 만드는 가장 단순한 방법은 Object의 인스턴스를 만들고 여기에 프로퍼티와 메서드를 추가하는 방법이다.

var person = {   name : "nicholas",   age " 29",

  sayName : function(){     console.log(this.name);   } }


6.1.1 프로퍼티타입
프로퍼티의 특징은 내부적으로만 유효한 속성에 따라 자바스크립트 엔진 내부에서 구현하는 것으로 정의했으므로 이들 속성에 직접적으로 접근할수 있는 방법은 없다.
프로퍼티에는 데이터 프로퍼티와 접근자 프로퍼티 두가지 타입이 있고 이들 속성은 [[Enumerable]] 처럼 이름을 대괄호로 감싸서 나타낸다.


데이터 프로퍼티
데이터 프로퍼티는 데이터 값에 대한 단 하나의 위치를 포함하여 이 위치에서 값을  읽고 쓴다.

[[Configurable]] - 해당 프로퍼티가 delete를 통해 삭제하거나 프로퍼티 속성을 바꾸거나 접근자 프로퍼티로 변환할수 있음을 나타내고 기본 속성은 true이다.
[[Enumerable]] - for-in 루프에서 해당 프로퍼티로 반환함을 나타내고 기본속성은 true이다.
[[Writable]] - 프로퍼티의 값을 바꿀수 있음을 나타내고 기본 속성을 true이다.
[[Value]] - 프로퍼티의 실제 데이터 값을 포함하고 기본 속성 값은 undefined이다.

기본 프로퍼티 속성을 바꾸려면 반드시 Object.defineproperty()메서드를 써야하고 이 메서드는 프로퍼티를 추가하거나 수정할 객체, 프로퍼티 이름, 서술자 객체 세가지를 매개변수로 받는다.


접근자 프로퍼티
접근자 프로퍼티에는 데이터 값이 들어있지 않고 대신 getter 함수와 setter 함수로 구성된다
접근자 프로퍼티를 읽을 때는 getter 함수가 호출되며 유효한 값을 반환할 책임은 이 함수에 있고 접근자 프로퍼티에 쓰기 작업을 할 때는 새로운 값과 함께 함수를 호출하며 이 함수가 데이터를 어떻게 사용할지 결정한다.

[[Configurable]] - 해당 프로퍼티가 delete를 통해 삭제하거나 프로퍼티 속성을 바꾸거나 접근자 프로퍼티로 변환할수 있음을 나타내고 기본 속성은 true이다.
[[Enumerable]] - for-in 루프에서 해당 프로퍼티로 반환함을 나타내고 기본속성은 true이다.
[[Get]] - 프로퍼티를 읽을 때 호출할 함수로 기본값은 undefined이다.
[[Set]] - 프로퍼티를 바꿀 때 호출할 함수로 기본값은 undefined이다.

접근자 프로퍼티를 명시적으로 정의할수 없으며 반드시 Object.defineproperty()를 써야한다.
프로퍼티의 값을 바꿨을 떄 해당 프로퍼티만 바꾸는게 아니라 부수적인 절차가 필요한 경우에 사용한다.


6.1.2 다중 프로퍼티 정의
객체에서는 프로퍼티를 동시에 여러개 수정해야할 가능성이 높으므로 Object.defineProperties() 메서드를 제공한다. 

var book = {};

Object.defineProperties(book, {   _year : {     value : 2004   },
  edition : {     value : 1   },

  year : {     get : function(){       return this._year;     },     set : function(newValue){       if(newValue > 2004){         this._year = newValue;         this.edition += newValue - 2004;       }     }   } })

 


이 코드는 book 객체에 _year 와 edition 두 가지 데이터 프로퍼티와 접근자 프로퍼티 year 를 생성한다.


6.1.3 프로퍼티 속성 읽기
ECMAscript5의 Object.getOwnPropertyDescriptor() 메서드를 이용해 원하는 프로퍼티의 서술자 프로퍼티를 읽을수 있고 읽어올 프로퍼티가 포함된 객체, 서술자를 가져올 프로퍼티 이름 두 가지 매개변수를 받는다.

 

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

함수 표현식  (0) 2014.10.23
참조타입  (0) 2014.10.17
변수와 스코프, 메모리  (0) 2014.10.07
언어의 기초  (0) 2014.10.01
HTML 속의 자바스크립트  (0) 2014.09.23

표현식과 연산자

2014. 10. 13. 13:12 나홀로스터디/JS 완벽가이드


5장 표현식과 연산자

이 포스팅은 "자바스크립트 완벽 가이드(인사이트, 송인철,이동기,이유원,황인석 옮김)"에서 발췌 요약한 것입니다.
 
5.1 표현식
5.2 연산자 개요
5.3 산술 연산자
5.4 동등 연산자
5.5 관계연산자
5.6 문자열 연산자
5.7 논리 연산자
5.8 비트 단위 연산자
5.9 할당 연산자
5.10 기타 연산자들


5.1 표현식
표현식이란 자바스크립트 인터프리터가 계산하여 값을 구할 수 있는 자바스크립트 구절로 가장 간단한 표현식은 리터럴 또는 변수의 이름이다.  리터럴 표현식의 값은 그 리터럴 값 자신이고 변수 표현식의 값은 해당 변수가 저장하거나 참조하는 값이다.



5.2 연산자 개요
대부분의 연산자는 + 나 - 와 같은 문장부호로 표현되지만 일부는 delete나 instanceof와 같이 키워드로 표현된다.


5.2.1 피연산자 개수

2항 연산자는 두 개의 표현식을 조합하여 하나의 더 복잡한 표현식으로 만들어 내기도 하고 단항 연산자를 지원하기도 한다.

5.2.2 피연산자 타입

피연산자 표현식을 작성할 때는 연산자에 전달되는 데이터 타입과 반환되는 데이터 타입을 주의해야 한다.
'a', 'b' 와 같은 문자열은 곱할수 없지만 자바스크립트에서는 가능한 적절한 타입으로 표현식을 반환하려고 시도한다.
+ 연산자는 숫자 타입 피연산자들에 대해 덧셈을 하지만 문자열타입 피연산자들끼리는 이어 붙이기를 한다.
비교 표현식을 평가하면 언제가 그 비교가 참인지 거짓인지 가리키는 기본 불리언 타입 값을 얻는다.

5.2.3 연산자 우선순위
연산자 우선순위란 연산이 수행되는 순서를 말한다. 원래 정해진 연산자 우선순위를 바꾸려면 확실하게 괄호를 쓰면된다.

5.2.4 연산자 결합 방향

단항, 할당, 3항 비교 연산자들의 결합 방향은 오른쪽에서 왼쪽으로 이루어진다.



5.3 산술 연산자

덧셈( + )
+ 연산자는 숫자 타입 피연산자의 덧셈이나 문자열 타입 피연산자의 이어 붙이기에 쓰이는데 만일 하나의 피연산자가 문자열이라면 나머지 하나의 피연산자를 문자열로 변환한후 이어붙인다.  객체 피연산자는 더하거나 이어 붙일수 있게 숫자나 문자열로 변환하는데 이 변환은 객체의 valueOf() 메서드나 toString() 메서드에 의해 수행된다.

뺄셈( - )
- 연산자가 2항 연산자로 쓰일 경우 첫 번째 피연산자에서 두번째 피연산자를 뺀다. 피연산자가 숫자타입이 아닐경우 먼저 숫자타입으로 변환을 시도한다.

곱셉( * )
* 연산자는 두 연산자를 곱하는데 피연산자가 숫자타입이 아니라면 먼저 숫자타입으로 변환을 시도한다.

나눗셈( / )
/ 연산자는 첫번째 연산자를 두번째 연산자로 나누는데 피연산자가 숫자타입이 아니라면 먼저 숫자타입으로 변환을 시도한다.
자바스크립트에서는 모든 숫자가 부동소수점으로 취급된다.
0으로 나누는 연산결과는 양의 무한대, 또는 음의 무한대가 되며 0/0의 결과는 NaN이 된다.

나머지( % )
% 연산자는 첫번째 피연산자를 두번재 피연산자로 나누고 남은 나머지를 반환한다. 피연산자가 숫자타입이 아닌경우 먼저 숫자타입으로 변환을 시도한다.

단항 마이너스( - )
- 가 하나의 피연산자 앞에서 단항 연산자로 쓰이면 단항 부정을 수행한다.
양수값을 같은 크기의 음수값으로, 음수값은 같은 크기의 양수 값으로 바꾼다.

단항플러스( + )
숫자 리터럴 부호를 명시적으로 지정할수 있게 해준다.
+ 연산자는 전달인자를 숫자 타입으로 변환하는 효과가 있고 전달인자가 변환될수 없는 경우 NaN을 반환한다.

증가( ++ )
++ 연산자는 단항 피연산자에 대해 증가 연산을 수행하는데 피연산자는 변수, 배열, 원소 또는 객체 프로퍼티 중 하나여야한다. 이것이 아닐경우 ++ 연산자는 일단 숫자타입으로 변환을 시도한다.
이 연산자의 정확한 작동은 피연산자의 어느쪽에 연산자가 놓여 있는가에 따라 앞에서 사용될 경우 전치증가 연산자라 부르며 피연산자의 뒤에서 사요오딜 경우 후치증가 연산자라고 부른다.

감소( -- )
-- 연산자는 단항 피연산자에 대해 감소 연산을 수행한다.



5.4 동등 연산자
== 연산자와 === 연산자 모두 두 값이 같은지 확인하는데 쓰이지만 '같다' 는 것을 정의하는 기준이 서로 다르다.
두 연산자 모두 피연산자의 타입을 가리지 않으며 주어진 피연산자가 같으면 true 를, 다르면 false 를 반환한다는 점에서 공통적이다. = 는 '취하다' 또는 '할당하다',  == 는 '~와 동등하다', === 는 '~와 일치한다'라고 읽는다.

반면 객체, 배열, 함수는 '참조에 의해' 비교된다. 두 변수가 같은 객체를 참조할 때에만 이 두 변수는 동등하다고 말하는 것이다.

5.4.2 부등(!=)과 불일치(!==)

부등 연산자 != 는 두 값이 서로 동등할 경우 false를 반환하며 그렇지 않을 경우 true를 반환한다.
불일치 연산자 !== 는 두 값이 서로 일치할 경우 false를 반환하며 그렇지 않을경우 true를 반환한다.




5.5 관계연산자
이 연산자들은 두 값의 관계를 테스트하고 해당 관계가 존재하는지 여부에 따라 true 또는 false를 반환한다.

5.5.1 비교 연산자
비교연산자는 두 값의 상대적인 순서를 판단하는데 쓰인다.

더 작다(<)
더 크다 (>)
더 작거나 같다(=<)
더 크거나 같다(<=)

문자열이 비교될 때에는 Unicode로 인코딩 된 각 문자에 해당하는 숫자값 기준으로 엄격히 문자대 문자로 비교된다.
인코딩 차이와 같은 다양성을 고려하는 문자열 비교 알조리즘으로 String.localeCompare() 메서드가 있다.


5.5.2 in 연산자
in연산자는 좌변의 피연산자로 문자열을 받는다. 우편의 피연산자로는 객체나 배열을 받는다.

5.5.3 instanceof 연산자
instanceof 연산자는 좌변의 피연산자로 객체를, 우변의 피연산자로 객체 클래스의 이름을 받는데 좌변 객체가 우변 클래스의 인스턴스일 경우 연산 결과는 true 이고 그렇지 않을 경우 false이다.




5.6 문자열 연산자
+ 연산자는 두 문자열 피연산자를 이어 붙인다.
<, <=, >, >= 연산자들은 두 문자열을 비교하여 그 순서를 판단하는데 비교의 기준은 알파벳 순서다.
+ 연산자는 숫자 피연산자보다 문자열 피연산자에 우선권을 부여한다.




5.7 논리 연산자

5.7.1 논리 AND(&&)
&& 연산자가 불리언 피연산자에 대해 쓰일 경우 이 연산자는 두 값에 대한 불리언 AND를 수행하고 첫번째 피연산자와 두번째 피연산자가 모두 'true' 일 경우에만 연산결과로 true를 반환하므로 좌변 표현식의 값에 따라 우변 표현식을 평가할 수도 있고 평가하지 않을수도 있다.

5.7.2 논리 OR(||)
|| 연산자가 불리언 피연산자에 대해 쓰일 경우 이 연산자는 두 값에 대한 불리언 OR을 수행하고 두 피연산자중 하나가 true 이거나 둘 다 true 일 경우 연산결과로 true를 반환한다.

5.7.3 논리 NOT(!)
! 연산자는 단항 연산자로 이 연산자는 단일 피연산자 앞에 놓인다.  이 연산자의 목적은 피연산자의 불리언 값을 반전, 즉 반대로 바꾸는 것이다.




5.8 비트 단위 연산자
비트 단위 연산자가 작용하는 것은 32비트 정수 표현법이다.




5.9 할당 연산자
= 연산자는 오른쪽 값을 왼쪽의 변수, 배열 원소, 객체 프로퍼티 등에 할당하므로 앞으로 이 변수, 원소, 프로퍼티 등을 사용하면 그 할당된 값을 참조하는 것이 된다.

할당 연산자의 연산자 결합 방향은 오른쪽에서 왼쪽이고 각 할당 표현식의 값은 우변의 값과 같다. 
  

i = j = k = 0;  





5.10 기타 연산자들

5.10.1 조건부 연산자(?:)
자바스크립트의 유일한 3항 연산자이다.
첫번째 연산자는 ? 앞에 위치하고 두번째는 ? 와 : 사이에 위치하며 세번재는 : 뒤에 위치한다.

x > 0 ? x * y : -x *  y; 

조건부 연산자의 첫번째 피연산자는 불리언 값이어야 하고 조건부 연산자가 반환하는 값은 첫 번째 피연산자의 불리언 값에 의해 결정되는데 그값이 true이면 조건부 표현식의 값은 두 번째 피연산자의 값이 되고 첫번재 피연산자의 값이 false이면 조건부 표현식의 값은 세 번재 피연산자의 값이 된다.

5.10.2 typeof 연산자
typeof 연산자는 단일 피연산자 앞에 위치하는 단항 연산자로 피연산자는 아무 타입이라도 무방하다.
이 연산자의 값은 피 연산자의 데이터 타입을 가리는 문자열로 피연산자가 숫자, 문자열, 불리언 값일 경우 typeof 연산자의 결과도 그에따라 "number", "string", "boolean" 이 된다. 객체, 배열, null에 대해서는 "object" 를 반환한다. 함수 타입의 피연산자에 대해서는 "function" 을, 정의되지 않은 피연산자는 "undefined"를 반환한다.

5.10.3 객체 생성 연산자(new)
new 연산자는 새로운 객체를 생성하고 이를 초기화하기 위한 생성자 함수를 호출한다.

new constructor(arguments); 

constructor는 반드시 생성자 함수로 평가되는 표현식이어야 하고 이에 따르는 전달인자는 괄호로 감싸야 하며 전달인자가 두개 이상일때는 쉽표로 구분한다. new 연산자에만 해당하는 특수한 경우로 자바스크립트에서는 함수 호출에 전달인자가 없을 경우 괄호를 생략할수 있는 간단한 문법을 지원한다.

o = new Object;  // 선택적으로  쓸수 있는 괄호가 생략됨
d = new Date();   //  현재 시간을 나타내는 Date 객체 반환
c = new Rectangle(3.0, 4.0, 1.5, 2.75)   // Rectangle 클래스의 객체 생성
obj = new constructor[i](); 

 
5.10.4 delete 연산자

delete 는 단항 연산자이며 피연산자로 지정된 객체 프로퍼티, 배열 원소 또는 변수의 삭제를 시도하는데 피연산자가 성공적으로 삭제되었을 경우 true를 반환하고 삭제될수 없는 경우 false를 반환한다.
한가지 중요한 점은, delete가 영향을 미치는 것은 오직 프로퍼티 뿐이며 해당 프로퍼티가 참조하고 있떤 객체는 무관하다는 것이다.

5.10.5 void 연산자
void는 단일 피연산자 앞에 쓰이는 단항 연산자로 피연산자의 타입은 아무 타입이라도 관계없다.
이 연산자는 피연산자의 값을 무시하고 undefined를 반환한다. 가장 일반적인 사용처는 클라이언트 측의 javascript: URL 사용으로 브라우저에 평가된 값을 표시하지 않으면서 표현식을 평가할 수 있게 해준다.

5.10.6 쉼표 연산자(,)
쉼표연산자는 왼쪽의 전달인자를 평가하고 오른쪽의 전달인자를 평가한 후 오른쪽 전달인자 값을 반환한다.

i = 0, j = 1, k = 2;

i = 0; j = 1; k = 2;

하나의 표현식만 허락되는 상황에서 부수 효과가 일어나는 다수의 개별 표현식들을 평가해야 할 경우에 사용한다.

5.10.7 배열과 객체 접근 연산자
배열 원소에 접근하는데에는 대괄호 [] 를 사용하고 객체의 원소에 접근하는 데에는 마침표(.)를 사용하면 된다.
[] 와 마침표(.) 모두 자바스크립트 연산자로 취급된다.
연산자는 좌변 피연산자로 객체를 받으며, 우변 피연산자로는 식별자(프로퍼티 이름)를 받는다. 우변 피연산자는 프로퍼티나 메서드의 이름에 해당하는 리터럴이어야 한다.

document["lastMdfified"]
frame[0]['length']
data["val" + i ] 

[]는 보통 배열의 원소에 접근하는데 사용된다. 프로퍼티 이름을 따옴표로 인용해야 하므로 객체 프로퍼티에 접근하는 용도로는 마침표(.) 연산자보다 불편한데 객체가 연관배열로 사용될경우 프로퍼티 이름이 동적으로 생성되며 이 경우에는 오직 [] 연산자만 사용할 수 있다.

5.10.8 함수 호출 연산자
() 연산자는 자바스크립트에서 함수 호출에 사용되고 피연산자의 개수가 정해져 있지 않다.

'나홀로스터디 > JS 완벽가이드' 카테고리의 다른 글

객체와 배열  (0) 2014.10.20
문장  (0) 2014.10.16
변수  (0) 2014.10.07
데이터 타입과 값  (0) 2014.10.01
어휘구조  (0) 2014.09.24

변수

2014. 10. 7. 18:02 나홀로스터디/JS 완벽가이드


4. 변수

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
4.1 변수타입
4.2 변수선언
4.3 변수의 유효범위
4.4 기본타입과 참조타입
4.5 가비지 컬렉션
4.6 변수와 프로퍼티
4.7 변수의 유효 범위(재해석)

변수는 프로그램에서 쓰이는 데이터 값을 저장하고 다루는데 사용된다.


4.1 변수타입
자바스크립트 변수는 타입이 고정되어 있지 않아 어떠한 데이터 타입의 값이라도 담을수 있다.


4.2 변수선언
자바스크립트에서 어떤 변수를 사용하려면 일단 그 변수를 선언해야만 하는데 만일 변수의 초기값을 지정하지 않을 경우 선언은 되지만 값이 저장되기 전까지 값은 undefined이다.

4.2.1 변수 선언의 반복과 생략
var 구문으로 같은 이름의 변수를 여러번 선언해도 무방하다.
var 구문으로 선언되지 않은 변수에 값을 할당하려 하면 자바스크립트가 암묵적으로 그 변수를 선언하게 되며 그 변수는 항상 전역 변수로 선언된다.

4.3 변수의 유효 범위
프로그램에서 그 변수가 정의되어 있는 영역을 맒한다. 전역변수의 유효 범위는 전역적이고 반면 어떤 함수안에서 선언된 변수는 오직 그 함수 안에서만 정의된다. 이런 변수를 지역변수라고 부르며 유효 범위도 지역적이다.
함수 내부에서는 지역 변수가 같은 이름의 전역 변수보다 우선적으로 사용된다.

4.3.1 블록 단위의 유효 범위는 없다.
함수 안에서 정의된 변수는 그것이 정의된 위치에 관계없이 항상 함수 전체에 걸쳐 유효하다.
지역변수는 함수 전체에 걸쳐서 정의되어 있지만 var 문이 실행되고 나서야 실체로 초기화 된다.

4.3.2 정의되지 않은 변수 vs 할당되지 않은 변수
선언되지 않은 변수를 읽으려고 하면 런타임 오류가 발생한다. 그러나 정의되지 않은 변수에 값을 할당할 때는 에러가 발생하지 않는다. 이경우에는 암묵적으로 해당 변수가 전역의 유효범위로 선언된다.

선언은 되었으나 아직 값이 할당되지 않은 변수를 읽으려고 하면 그 변수의 초기값 'undefined' 를 얻게 된다.


4.4 기본 타입과 참조 타입
고정된 메모리를 차지하는 기본 타입은 숫자, 불리언 값, null, undefined 이  있고, 참조타입은 객체(object), 배열, 함수가 있다.
기본 타입의 경우 변수에 실제 값이 저장되지만 참조 타입은 단지 참조만이 저장된다.


4.5 가비지 컬렉션
참조 타입은 크기가 고정되어 있지 않으므로 동적으로 할당되어야 하는데 자바스크립트에서는 프로그래머가 수동으로 메모리를 해제하도록 강제하지 않는 대신 가비지 컬렉션이라 불리는 기술에 의존한다.


4.6 변수와 프로퍼티
변수와 객체 프로퍼티는 같은 방법으로 할당되고 자바스크립트 표현식에서 동일한 방법으로 사용딘다.

4.6.1 전역 객체
자바스크립트 인터프리터가 구동되면 자바스크립트 코드를 실행하기 전에 전역객체를 생성하면서 미리 정의된 값들과 함수들을 참조하는 다수의 프로퍼티들을 초기화한다.
최상위코드, 즉 어떤 함수에도 속하지 않은 코드에서는 자바스크립트의  this 키워드를 사용해서 전역객체를 참조할수 있다.

4.6.2 지역변수 : 호출객체
지역변수는 어떤 객체의 프로퍼티에 해당하고 이 객체를 일컬어 호출 객체(call object)라고 부른다.
호출객체는 전역 객체에 비해 수명이 짧지만 쓰이는 목적은 동일하며 함수를 실행하는 동안 그 함수의 전달인자와 지역변수는 이 호출 객체의 속성으로 저장된다.

4.6.3 자바스크립트 실행 컨텍스트
실행 컨텍스트는 자바스크립트 코드가 실행되고 있는 컨텍스트를 말한다.




4.7 변수의 유효 범위(재해석)
모든 자바스크립트 실행 컨텍스트에는 유효 범위 체인(scope chain) 이라는 것이 있다.



 

'나홀로스터디 > JS 완벽가이드' 카테고리의 다른 글

문장  (0) 2014.10.16
표현식과 연산자  (0) 2014.10.13
데이터 타입과 값  (0) 2014.10.01
어휘구조  (0) 2014.09.24
자바스크립트 소개  (0) 2014.09.23
Copyright © HuckleberryM All Rights Reserved | JB All In One Designed by CMSFactory.NET