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

변수와 스코프, 메모리

2014. 10. 7. 14:27 나홀로스터디/JS For Web Dev


4장 변수와 스코프, 메모리

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
4.1 변수의 원시 값과 참조 값
4.2 실행 컨텍스트의 이해
4.3 가비지 컬렉션의 이해

자바스크립트는 느슨한 타입으로 특정시간에서 특정 값을 가리키는 이름일 뿐,  변수가 가져야 할 데이터 타입에 대한 규칙이 없으므로 실행중에 변수의 값과 데이터 타입이 바뀔수 있다.


4.1 원시 값과 참조 값

ECMAScript의 변수는 원시 값과 참조 값 두가지 타입의 데이터를 저장할 수 있는데 '원시 값'은 단순한 데이터이며 '참조 값'은 여러 값으로 구성되는 객체를 말한다.
원시 타입은 Undefined와 Null, 불리언, 숫자, 문자열인데 변수에 저장된 실제값을 조작하기 때문에 '값으로' 접근한다고 한다.
참조 값은 메모리에 저장된 객체로 직접 메모리 공간을 조작하는 일은 불가능하며 객체를 조작할 때 사실 객체 자체가 아니라 해당 객체에 대한 참조를 조작하는 것이므로 '참조로' 접근한다고 한다.


4.1.1 동적 프로퍼티
원시값과 참조값의 정의는 비슷하지만 참조값에서 정의한 변수에는 프로퍼티와 메서드를 동적으로 추가할수 있다.
var person = new object(); person.name = "Nicholas"; alert(person.name); // "Nicholas"
var name = "Nicholas"; name.age = 27; alert(name.age);  // undefined

4.1.2 값 복사
원시 값을 다른 변수로 복사할 때는 현재 저장된 값을 새로 생성한 다음 새로운 변수에 복사한다.
참조 값을 다른 변수로 복사할 때는 현재 저장된 값을 새로 생성한 다음 새로운 변수에 복사하는 것은 같지만 그 값이 객체 자체가 아니라 저장된 객체를 가리키는 포인터라는 점이 다르다.

4.1.3 매개변수 전달
함수 매개변수는 모두 값으로 전달되는데 함수 외부에 있는 값은 함수 내부 매개변수에 복사된다.
변수는 값으로도, 참조로도 접근할 수 있지만 매개변수는 원시 값, 참조 값 모두 오직 값으로만 전달된다
함수 내에서 매개변수를 덮어쓰면 매개변수는 지역객체를 가리키는 포인터가 된다.

4.1.4 타입 판별
typeof 연산자는 특정 변수가 문자열이나 숫자, 불리언,  undefined라면 정확한 타입을 알수 있고 객체이거나 null이면 'object'를 반환한다.



4.2 실행 컨텍스트와 스코프
변수나 함수의 컨텍스트는 다른 데이터에서 접근할 수 있는지, 어떻게 행동하는지를 규정한다.
가장 바깥쪽에 존재하는 실행 컨텍스트는 전역 컨텍스트로 구현한 환경에 따라 다르게 불리는데 웹 브라우저에서는 이 컨텍스트를 window라고 부르므로 전역 변수와 함수는 모두 window객체의 프로퍼티 및 메서드로 생성된다.
함수를 호출하면 독자적인 실행 컨텍스트가 생성되는데 컨텍스트에서 코드를 실행하면 변수 객체에 '스코프 체인'이 만들어 진다.
스코프 체인의 목적은 실행 컨텍스트가 접근할 수  있는 모든 변수와 함수에 순서를 정의하는 것이다.
4.2.1 스코프 체인 확장
실행 컨텍스트에는 전역 컨텍스트와 함수 컨텍스트 두가지 타입만 있지만 (eval()을 호출할때 생성되는 세번째  타입이 있다) 스코프 체인을 확장할 수 있는 방법도 있다.
try-catch문의 catch블록과 with문은 스코프 체인 앞에 변수 객체를 추가한다.
4.2.2 자바스크립트에는 블록 레벨 스코프가 없다.
블록레벨 스코프를 지원하는 언어에서는 변수가 선언된 컨텍스트 안에서만 존재하지만 자바스크립트에서는 루프 실행이 끝난 후에도 존재한다.
변수선언
var를 사용해 선언한 변수는 자동으로 가장 가까운 컨텍스트에 추가된다. 변수를 선언하지 않은채 초기화하면 해당 변수는 자동으로 전역 컨텍스트에 추가된다.

식별자 검색

식별자가 로컬 컨텍스트에 정의되어 있으면 부모 컨텍스트에 같은 이름의 식별자가 있다해도 참조할 수 없다.




4.3 가비지 콜렉션
자바스크립트는 실행 환경에서 코드 실행 중에 메모리를 관리하는데 이런 의미에서 가비지 콜렉션 언어라고 부른다.

4.3.1 표시하고 지우기
가장 널리 쓰이는 가비지 컬렉션 방법으로 변수가 특정 컨텍스트 안에서 사용할 것으로 정의되면 그 변수는 그 컨텍스트 안에 있는 것으로 표시된다.
4.3.2 참조 카운팅
각 값이 얼마나 많이 참조되었는지 추적한다는 것이다.
4.3.3 성능
가비지 컬렉터는 주기적으로 실행되며 메모리 내 할당된 변수가 많다면 상당히 비용이 드는 작업으로 타이밍이 중요하다.
4.3.4 메모리 관리
일반적으로 가비지 컬렉션을 지원하는 프로그래밍 환경에서는 개발자가 메모리 관리를 신경쓰지 않아도 되지만 자바스크립트라는 환경에서 메모리 관리와 가비지 콜렉션은 다른 환경과 다르다.  메모리 제한은 변수 할당 뿐만 아니라 호출 스택, 스레드에서 실행할 수 있는 문장수에도 영향을 미친다.
메모리 사용을 최적화하는 가장 좋은 방법은 코드 실행에 필요한 데이터만 유지하는 것이다. 필요없어진 데이터에는 null을 할당하여 참조를 제거하는 편이 좋다.
변수에서 참조를 제거한다 해서 할당된 메모리가 자동으로 반환되는 것은 아니다. 참조 제거의 요점은 값의 컨텍스트를 없애서 다음에 가비지 콜렉션을 실행할 때 해당 메모리를 회수하도록 하는 것이다.



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

참조타입  (0) 2014.10.17
객체에 대한 이해  (0) 2014.10.15
언어의 기초  (0) 2014.10.01
HTML 속의 자바스크립트  (0) 2014.09.23
자바스크립트란 무엇인가  (0) 2014.09.22

데이터 타입과 값

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


3장 데이터 타입과 값

이 포스팅은 "자바스크립트 완벽 가이드(인사이트, 송인철,이동기,이유원,황인석 옮김)"에서 발췌 요약한 것입니다.
 
3.1 숫자
3.2 문자열
3.3 불리언 값
3.4 함수
3.5 객체
3.6 배열
3.7 null
3.8 undefined
3.9 Date 객체
3.10 정규표현식
3.11 Error 객체
3.12 타입변환요약
3.13 기본데이터 타입 래퍼 객체
3.14 객체에서 기본 타입으로 변환
3.15 값에 의한 vs. 참조에 의한


프로그램 언어로 표현할 수 있고 조작할수 있는 값의 종류를 데이터 타입이라고 하며 프로그램 언어의 기본은 그 언어가 지원하는 데이터 타입의 종류다.
자바스크립트는 세 가지 기본 데이터 타입인 숫자(number), 문자열(string), 불리언(boolean)과 단일값을 갖는 단순데이터 타입인 null과 undefined 가 있고 객체(object)라고 불리는 복합 데이터 타입을 지원한다.

자바스크립트에서 객체는 이름 붙은 값들의 순서 없는 모임을 나타내거나 번호가 붙은 순서 있는 값들의 모임인 배열을 나타내기도 하는데 객체와 배열은 근본적으로는 동일한 데이터 타입이지만 다른 방식으로 사용된다.

자바스크립트는 함수(function) 라고 불리는 특별한 객체를 지원하는데 함수는 특정 동작을 수행하기 위해 호출될
수 있다.



3.1 숫자
자바스크립트는 정수 값과 실수 값을 구별하지 않고 모든 숫자가 64비트 실수 형식을 사용하여 표현한다.
숫자 리터럴 앞에 마이너스(-)를 붙이면 음수를 만들수 있지만 (-)가 붙은 단항 부정 연산자는 숫자 리터럴 문법에 속하지 않는다. 


3.1.1 정수 리터럴
자바스크립트에서 10 진수 정수는 숫자 시퀀스(연속된) 형태로 작성된다.

3.1.2 16진수와 8진수
16진수 리터럴은 '0x''0X' 로 시작하고 16진수 숫자들을 입력한다.(0~9, 10~15)
8진수 리터럴은 숫자 0으로 시작되고 0부터 7까지 숫자 시퀀스가 따르는 형태다

3.1.3 부동소수점 리터럴
지수 표기법을 사용하여 부동소수점 리터럴을 표현할 수 있다.

3.1.4 숫자 조작
자바스크립트 언어에서는 기본 산술 연산자(+,-,*,/) 외에 코어 자바스크립트에서 제공하는 수의 수리 함수를 사용해 복잡한 연산을 수행할수 있고, 함수의 사용 편의를 위해 모두 Math라는 단일 객체의 프로퍼티도 들어있다.

   sine_of_x = Math.sin(x); 


3.1.5 숫자 변환
자바스크립트는 숫자를 문자열 형식으로 변환하거나 문자열을 숫자로 변환할 수 있다.

3.1.6 특수한 숫자 값
자바스크립트에서는 부동 소수점 값으로 표현 가능한 가장 큰 수보다 더 큰 값인 무한대를 나타내는 Infinity가 있다.
수리 연산이 정의되지 않은 결과를 산출하거나 에러를 발생시킬 경우 특수한 값인 NaN이 출력 되는데 어떤 숫자와도 동일하지 않는 값을 비교하기 위해 isNaN() 이라는 특별한 함수를 사용한다.




3.2  문자열(string)
문자열은 Unicode 문자나 숫자, 문장부호들의 시퀀스로 텍스트를 표현하는 자바스크립트 데이터 타입으로 작은 따옴표(' ') 혹은 큰 따옴표 쌍(" ")으로 문자열 리터럴을 포함시킬수 있다.

3.2.1 문자열 리터럴

문자열 리터럴은 한줄을 넘지 말아야 하고 줄바꿈 문자를 포함시키고 싶아면 문자열 리터럴 내에 Unicode를 사용할수 있다.

3.2.2 문자열 리터럴 내 이스케이프 시퀀스
역슬래시(\) 문자는 뒤에 나오는 문자와 결합될 경우 생략부호를 나타낼수 있다. 

   'You\'re right, it can\'t be a quote' 

3.2.3
문자열 조작
자바스크립트의 기본적인 조작은 문자열을 이어 붙이는 것이고 문자열의 길이를 알고 싶다면 length 프로퍼티를 사용하면 된다.

3.2.4 숫자를 문자열로 변환하기
숫자는 필요할 때 문자열로 자동으로 변환된다.
숫자를 문자열로 변환하려면 String() 함수를 사용하고 숫자를 문자열로 변환하는 다른 기법으로 toString() 메서드를 사용할 수 있다.

var string_value = String(number);
string_value = number.toString();


3.2.5 문자열을 숫자로 변환하기
문자열을 숫자로 명시적으로 변환하려면 Number() 생성자를 함수처럼 호출하는 것으로 10진수만 변환할수 있고 정수만 변환하는 parseInt()와 정수와 부동소수점 숫자를 모두 변환하는 parseFloat()가 있다.  지정된 문자열을 숫자로 변환하지 못할 경우 NaN을 반환한다.




3.3 불리언 값

불리언 값은 무엇이 참인지 거짓인지를 표현하는 것으로 truefalse 두 개의 값만을 가질 수 있다.

3.3.1 불리언 타입 변환
불리언 값이 숫자 문맥에서 사용되면 true 는 숫자 1로 false는 숫자 0으로 변환되고 문자 문맥에서 사용되면 "true" 또는 "false"로 변환된다.
명시적 타입 변환을 하는 방법은 Boolean() 함수를 사용하는 것과 불리언 NOT 연산자를 두번 사용하는 방법이 있다.

var x_as_boolean = Boolean(x);
var x_as_boolean = !!x; 

 

 


3.4 함수(function)

함수는 자바스크립트 프로그램에 정의되어 있거나 자바스크립트 구현에 미리 정의되어 있는 실행가능한 코드로 계산 대상인 값들을 지정하는 전달인자(arguments)나 매개변수(parameter) 를 넘겨 받을수 있으며 계산 결과 값을 반환할 수도 있다.

function square(x){ // 함수 이름은 square 이다. 전달인자 x 하나를 받는다.
  return x * x; // 이 함수는 전달인자를 제곱한 값을 반환한다.
}

함수는 단지 정의하고 호출할수 있는 것이지 데이터 타입은 아니다. 그러나 자바스크립트에서 함수는 숫자나 문자열처럼 데이터 값이므로 다른 값처럼 객체 프로퍼티에 할당될 수 있다.
함수가 어떤 객체의 프로퍼티로 할당되면 그 객체의 메서드라고 부른다.

3.4.1 함수 리터럴
자바스크립트는 함수를 정의하는 함수 리터럴 function 키워드, 함수이름(생략가능), 괄호로 둘러쌓인 함수 전달인자 목록, 중괄호로 구성된다.

함수 정의와 함수 리터럴 간에 큰 차이는 함수 리터럴은 자바스크립트 표현식 내에 나타날 수 있다는 점이다.

function square(x) { return x * x; }
var square = funcion(x) { return x * x;}   




3.5 객체(object)
객체는 이름붙은 값들의 모음으로 보통 이 이름붙은 값들을 객체의 프로퍼티라고 부른다.
객체의 프로퍼티를 참조하려면 객체 이름을 쓰고 이어서 마침표와 프로퍼티 이름을 적어주면 된다.

프로퍼티는 배열이나 함수, 객체를 포함한 어떤 타입의 값이라도 담을 수 있고, 함수가 객체 프로퍼티로 저장될 경우 그 함수를 메서드라고 부른다. 객체 메서드를 호출할때는 객체로부터 함수 값을 호출하기 위해 . 을 사용하고 함수를 호출하기 위해 () 를 사용한다.

연관배열로 사용되는 경우 객체 프로퍼티에 접근할때는 대괄호를 사용한다.

image["width"] 


3.5.1 객체 생성
객체는 특수한 생성자 함수를 호출하여 생성할수 있다.

var o = new objoct(); var now =   new Date(); var pattern = new RegExp("\\sjava\\s", "i");


3.5.2 객체 리터럴
자바스크립트는 객체를 생성하고 프로퍼티를 지정하는 객체 리터럴(객체 초기자라고도 불린다) 문법을 제공한다.

3.5.3 객체 변환

객체가 문자열 문맥에서 사용되면 toStrint() 메서드가 호출되고 반환하는 문자열이 사용된다.  객체가 숫자 문맥에서 사용되면 객체의 valueOf() 메서드를 호출하고 그 값을 반환한다.


 

3.6 배열(array)
배열은 객체처럼 데이터 값들의 모음으로 객체 내에 포함되는 각 데이터 값에는 이름이 있는 반면 배열의 각 데이터 값에는 번호, 즉 인덱스(index) 가 있다.

3.6.1 배열 생성

배열은 Array() 생성자 함수로 생성할 수 있는데 Array(n) 생성자에 정수 하나만 넘겨주면 그 숫자는 배열의 크기로 사용된다.

3.6.2 배열 리터럴
배열 리터럴(혹은 배열 초기자)은 대괄호로 둘러싸인 쉽표로 구분된 값들의 목록이다.

var a = [ 1.2, "javascript", true, { x : 1, y : 3}]; 




3.7 null
null은 객체타입의 특수한 값, 어떤 객체도 나타내지 않는 값으로 취급되며 불리언 문맥에서 사용되면 false로 변환되고 숫자 문맥에서는 0으로 문자열 문맥에서는 "null"로 변환된다.



3.8 undefined
undefined는 선언은 되었지만 값이 할당된 적이 없는 변수에 접근하거나 존재하지 않는 객체 프로퍼티에 접근할 경우 반환되는 값이다.

null과 undefined 값은 서로 구별되는 값이지만 동등 연산자 == 는 둘을 같은 것으로 간주한다.



3.9 Date 객체
Date객체는 new 연산자와 Date() 생성자로 생성할 수 있다.



3.10 정규 표현식
자바스크립트의 정규 표현식은 RegExp 객체로 표현되며 RegExp() 생성자로 생성할수 있다.



3.11 Error 객체
자바스크립트 인터프리터는 런타임 에러가 발생하면 클래스들 중 하나에 해당하는 객체를 던진다.



3.13 기본 데이터 타입 래퍼 객체
자바스크립트에는 세 가지 핵심 기본 데이터 타입 각각에  대응되는 클래스가 정의되어 있어 숫자, 문자열, 불리언 데이터 타입을 지원할 뿐 아니라 Number, String, Boolean 클래스도 지원하고 이 클래스들은 기본 데이터 타입을 둘러싼 래퍼들이다.
래퍼는 기본 데이터 타입 값과 동일한 값을 담고 있지만 데이터 조작을 위한 프로퍼티와 메서드도 가지고 있다.



3.14 객체에서 기본 타입으로 변환
null 이 아닌 객체가 불리언 문맥에서 사용되면 true 로 변환한다.
대부분의 객체는 Object 의 기본 value() 메서드를 상속 받으며 객체 그 자체를 반환하는데 기본 데이터 타입 값을 반환하지 않기 때문에 자바스크립트는 다음으로 toString() 메서드를 호출하고 반환되는 문자열을 숫자로 변환하므로써 객체를 숫자로 변환하려고 시도한다.



3.15 값에 의한 vs 참조에 의한
자바스크립트는 데이터 값을 조작할수 있는데 값을 복사하여 새로운 변수에 할당할 수 있고 함수나 메서드의 전달인자로 넘겨줄수 있다. 또한 두 값이 동일한지 알아보기 위해 한 값과 다른 값을 비교할 수 있다.

값에 의해 데이터를 조작할 때 중요한 것은 데이터 값인데 값 할당 시에는 실제 값이 복사되며 복사본은 변수, 객체 프로퍼티, 배열 원소에 저장되어 원본과 완전히 별개로 저장되는 독립적인 값으로 데이터를 값에 의해  함수에 전달하면 데이터 복사본이 전달된다.
참조에 의한 조작은 값에 대한 실제 복사본이 오직 하나만 존재하는 것으로 값이 참조에 의해 조작될 때 변수는 직접 값을 담지 않고 값에 대한 참조를 담을 뿐이다.



3.15.1 기본타입과 참조타입
자바스크립트에서 숫자와 불리언 타입은 정해진 갯수의 작은 바이트로 구성되어 자바스크립트 인터프리터가 저수준 오퍼레이션을 통해 손쉽게 조작이 가능한 기본 타입이다.
반면 객체와 특수한 종류인 배열, 함수는 임의 개수의 프로퍼티나 원소를 포함할 수 있으므로 값에 의해 조작하면 복사나 비교작업에 메모리를 비효율적으로 많이 사용해야하기 때문에 참조타입이다.

 

 

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

문장  (0) 2014.10.16
표현식과 연산자  (0) 2014.10.13
변수  (0) 2014.10.07
어휘구조  (0) 2014.09.24
자바스크립트 소개  (0) 2014.09.23

언어의 기초

2014. 10. 1. 10:41 나홀로스터디/JS For Web Dev


3장 언어의 기초

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
3.1 문법 훑어보기
3.2 데이터 타입
3.3 제어문
3.4 함수 이해


3.1 문법
ECMAScript의 문법은 C언어,자바나 펄 등 C와 비슷한 언어에서 차용한것이다.


대소문자 구분
변수, 함수이름, 연산자 모두 대소문자를 구분한다.


식별자

식별자란 변수나 함수, 프로퍼티, 함수 매개변수의 이름으로 다른문자에는 자유롭게 사용할수 있으나 첫글자는 반드시 글자밑줄(_),달러기호($)중 하나로 한다.

ECMAScript 식별자는 내장 함수와 객체가 카멜케이스로 표기되어 있어 이 형식을 따른다.
- 키워드와 예약어 및 true, false, null은 식별자로 사용할 수 없다.


주석

// 한줄주석
/* 
* 블럭주석은 슬래시다음 아스테리스크를 쓴 형태(/*)로 시작하며
* 그 반대(*/)로 끝난다. 
*/


스트릭트 모드
ECMAScript 5에서 도입한 '스트릭트 모드'는 기존과 다르게 자바스크립트를 파싱하고 실행하라는 것으로 스크립트 맨 위에 "use strict"; 를 추가하여 적용한다.
함수 하나만 스트릭트 모드로 전환하려면 함수본문 앞에 추가한다.


문장
ECMAScript에서 문장은 세미콜론으로 종료하며 세미콜론으로 끝내지 않으면 압축했을때 문법 에러가 발생할수 있고 C언어 스타일의 문법과 같이 코드블록은 여는 중괄호 {} 로 시작해서 닫는 중괄호 {}로 끝난다.



3.2 키워드와 예약어
키워드와 예약어는 식별자 이름이나 프로퍼티 이름에 쓸수 없다.



3.3 변수
키워드와 예약어는 식별자 이름이나 프로퍼티 이름에 쓸수 없다.

변수를 정의할때는 var 연산자 다음에 변수 이름을 쓰는데 var는 키워드이며 변수 이름은 식별자다.
변수를 초기화하지 않으면 특별한 값 undefined가 할당되는데 ECMAScript에서는 변수 초기화를 지원하므로 변수를 선언하는 동시에 값을 할당할 수 있다.

   
var message = "hi"; 


var 연산자는 변수를 로컬 스코프에서 정의한다. 함수안에서 var를 써서 변수를 정의하면 해당 변수는 함수를 종료하는 즉시 파괴된다.

변수를 여러개 선언하려면 다음과 같이 각변수를 쉼표(,)로 구분하여 한문장에서 선언할수 있다.

   
var message = "hi",
    found = false,
    age = 29; 





3.4 데이터 타입
ECMAScript에는 '원시 데이터 타입'이라고도 부르는 Undefined, Null, Boolean, 숫자, 문자열 다섯가지 기본적인 데이터 타입이 있다.
복잡한 데이터 타입이라고 불리는 객체는 이름-값 쌍의 순서없는 목록이고 모든 데이터는 여섯가지 타입중 하나에 속하며 한가지 데이터 타입이 여러 특성을 가질수 있다.


3.4.1 typeof 연산자
변수의 데이터 타입을 알아내야 할때 typeof 연산자를 사용하고 값(변수)에 typeof 연산자를 사용하면 다음 문자열 중 하나를 반환한다.

정의되지 않은 변수 : "undefined"
불리언 : "boolean"
문자열 : "string"
숫자 : "number"
함수를 제외한 객체 또는 null : "object"
함수 : "function"


typeof는 함수가 아니라 연산자이므로 괄호는 쓰지 않아도 되고 기술적으로 함수는 객체로 간주된다.

   
var message = "some string";
console.log(typeof message); // "string"
console.log(typeof 94); // "number" 




3.4.2 undefined 타입
var를 써서 변수정의를 했지만 초기화하지 않았다면 undefined가 할당됩니다. 

var message; // var message == undefined
console.log(message == undefined); // true



undefined는 빈 객체를 가리키는 포인터인 null과의 비교의 목적으로 추가된 속성으로 추가되었다. 

console.log(age); // 에러 


정의하지 않은 변수에 typeof를 호출하면 "undefined"를 반환한다.



3.4.3 Null 타입
null은 빈 객체를 가리키는 포인터이므로 typeof를 호출하면 "object"를 반환하고 null == undefined를 비교하면 true를 반환하지만 두 값은 다르게 쓰인다.
객체를 사용해야 하지만 해당 객체를 이용할 수 없을때는 항상 null이 와야한다.


3.4.4 불리언타입

불리언타입은 true, false 두가지 리터럴 값만 가지고 있지만 Boolean() 함수를 호출하여 모든 타입을 불리언 값으로 변환할수 있다. 

   
var message = "Hello world";
var messageAsBoolean = Bollean(message); 





3.4.5 숫자타입
기본적인 숫자 리터럴 형식은 10진법이다.
대단히 크거나 작은 부동소수점 숫자를 표현할때는 'e-표기법'을 쓴다.

NaN
숫자를 반환할 것으로 의도한 조작이 실패했을 때 반환하는 값으로 에러가 아니다.
NaN에는 고유한 특성이 있는데 NaN이 포함된 조작은 항상 NaN을 반환하고 어떤 값과도 일치하지 않으므로 ECMAScript에서는 isiNaN() 함수를 따로 제공한다.
isNaN() 함수는 받은 값이 '숫자가 아닌 값'인지 검사하고 숫자로 바꿀 수 있는 값 'number', boolean은 숫자로 변환하므로 숫자로 변환할수 없는 값을 넘기면 true를 반환한다.

- isNaN() 함수에 객체를 넘길수도 있는데 이때 객체의 valueOf() 메서드를 호출하여 확인하고 없다면 toString() 메서드를 호출해서 반환받은 값을 숫자로 바꿀수 있을지 확인한다.

숫자변환
숫자가 아닌 값을 숫자로 바꾸는 세가지 함수는 어떤 데이터 타입에도 사용가능한 Number() 함수와, 문자열을 숫자로 바꾸는 parseInt(), parseFloat() 함수가 있다.


Number() 함수의 매개변수로

불리언 값을 넘겼다면 true, false를 각각 1과 0으로 바꿔 반환한다.
null을 넘겼다면 0을 반환한다.
undefined을 넘겼다면 Nan을 반환한다.
객체를 넘겼다면 valueOf() 메서드를 호출하고 결과가 NaN이라면 toString() 메서드를 호출한후 반환한다.

perseInt() 함수는 항상 진법 매개변수를 함께 명시하는 습관을 들이는것이 좋다.
perseFloat() 함수는 항상 10진수를 기준으로 파싱한다.


3.4.6 문자열 타입

문자열 데이터 타입은 16비트 유니코드 문자의 연속이다

문자 리터럴

\n 줄바꿈
\t 탭
\\ 역슬래시
\' 따옴표

문자열 변환
- 값에 toString() 메서드가 존재한다면 매개변수 없이 호출하여 결과를 반환한다.
- 값이 null이라면 "null"을 값이 undefined라면 "undefined"를 반환한다.


3.4.7 객체타입
ECMAScript에서 객체는 데이터와 기능의 집합으로 Object 타입의 '인스턴스'를 만들고 프로퍼티나 메서드를 추가하여 객체를 만들수 있다. 

var o = new Object(); 





Object타입은 자바의 java.lang.Object 처럼 이 타입에서 파생하는 모든 객체의 원형이고 Object 타입의 인스턴스는 Object 타입의 프로퍼티와 메서드를 모두 상속한다.




3.5 연산자
ECMAScript에는 '원시 데이터 타입'이라고도 부르는 Undefined, Null, Boolean, 숫자, 문자열 다섯가지 기본적인 데이터 타입이 있다.
복잡한 데이터 타입이라고 불리는 객체는 이름-값 쌍의 순서없는 목록이고 모든 데이터는 여섯가지 타입중 하나에 속하며 한가지 데이터 타입이 여러 특성을 가질수 있다.


단항 연산자
단 하나의 값에만 적용되는 연산자이며 가장 단순한 연산자이다.


증감 연산자
C언어에서 차용한 것이며 피연산자의 앞이나 뒤에 쓴다. ++을 피연산자 앞에 쓰면 피연산자에 1을 더하고 -- 를 쓰면 피연산자에서 1을 뺀다.
증감연산자를 변수 앞에 쓰면 변수의 값을 바꾼 다음 문장을 평하하는데 이를 보통 부작용이라고 말한다.


단항 플러스와 단항 마이너스

단항플러스는 숫자형 값에는 변화가 없고 숫자가 아닌 값에 적용하면 형 변환 함수인 Number()와 마찬가지로 동작한다.
단항마이너스 연산자는 숫자형 값의 부호를 바꾸는 용도로 사용하고 숫자가 아닌 값에 적용하면 단항 플러스와 같은 규칙을 적용하고 그 결과의 부호를 바꾼다.



3.5.2 비트 연산자
비트 연산자는 IEEE-754 64비트 표현을 직접 조작하지는 않지만 값을 32비트 정수로 변환하여 비트 연산자를 적용한 후 결과를 다시 64비트로 바꾼다.


3.5.3 불리언 연산자
불리언 연산자에는 NOTAND, OR 세 가지가 있다.

논리 NOT
느낌표(!)로 표시하며 데이터 타입에 관계없이 항상 불리언 값을 반환하는데 먼저 피연산자를 불리언 값으로 변환한 다음 그 결과를 부정하며 동작한다.
논리 NOT 연산자는 값을 불리언 타입으로 바꾸는데 유용한데 연달아 두개를 쓰게 되면 Boolean() 함수를 쓴 것과 마찬가지 효과가 있다.

논리 AND

앰퍼센트 2개(&&)로 나타내며 피연산자가 불리언 값이 아니어도 사용할수 있다.

논리 OR
파이프 2개(||)로 표현하며 피연산자가 불리언 값이 아니어도 사용할수 있는데 피연산자중 하나가 불리언이 아니라면 논리 OR에서 불리언 값을 반환하지 않을수도 있다.
논리 OR 연산자의 행동을 이용해서 변수에 null이나 undefined가 저장되지 않게 할수 있다. 

var myObject = preferrendObject || backupObject; 





3.5.4 곱셈관련연산자
피 연산자 중 숫자가 아닌 값은 이면에서 Number() 함수를 이용해 타입을 바꾸는데 빈 문자열은 0으로 취급되고 불리언 true는 1로 취급된다.

곱셈
피연산자 중 하나가 숫자가 아니면 이면에서 Number()를 적용하고 기타 규칙을 적용해 숫자로 변환한다.

나눗셈
슬래시(/)기호로 구분하고 첫번째 피연산자를 두번째 피연산자로 나눈다

나머지
퍼센트 기호(%)로 나타내며 두 피연산자가 모두 숫자라면 일반적인 나눗셈을 적용하고 나머지를 반환한다.



3.5.5 덧셈 관련 연산자
피연산자중 하나가 문자열인 경우 두번째 문자열을 첫번째 문자열에 합친다.
피연산자 중 하나가 문자열이라면 다른 피연산자를 문자열로 변환하고 두 문자열을 합친다.



3.5.6 관계연산자
관계연산자는 미만(<)과 초과(>), 이하(<=), 이상(>=)이 있고 불리언 값을 반환한다.



3.5.7 동일연산자
동일/비동일 연산자는 비교하기 전에 타입을 변환하며 일치/불일치 연산자는 타입변환 없이 비교하는것으로 정했다.

동일과 비동일
두 변수가 동일한지 판단하는 동일 연산자는 == 로 표시하며 두 연산자가 동일하면 true를 반환한다.
비동일 연산자는 != 로 나타내며 두 연산자가 동일하지 않으면 true를 반환한다.
이렇게 피연산자를 비교하기 전에 변환하는 것을 '타입강제'라 부른다.

두 연산자가 모두 객체라면 같은 객체인지 비교하고 두 피연산자가 모두 같은 객체를 가리킨다면 동일 연산자는 true를 반환한다.

일치와 불일치
일치 연산자는 === 로 나타내며 피연산자의 타입을 변환하지 않아도 같을 때에만 true를 반환한다.



3.5.8 3항 연산자
이 코드는 boolean_expression을 평가한 결과에 따라 변수 variable에 다른값을 저장하는데 true로 평가되면 true_value가 저장되고 false로 평가되면 false_value가 저장된다. 

var max = (num1 > num2) ? num1 : num2; 




num1이 num2보다 크다면 max에 num1이 저장되고 작거나 같다면 num2를 max에 저장한다.



3.5.9 할당 연산자
단순한 할당은 = 로 나타내며 덧셈이나 곱셈 관련 비트 시프트 연산자와 = 기호를 합쳐 복합 할당 연산자를 반들수 있다. 

   
var num = 10;
num += 10; // num = num + 10 





3.5.10 쉼표 연산자
문장을 하나의 문장으로 합칠때 사용한다.

   
var num1 = 1, num2 = 2, num3 = 3; 




쉼표 연산자를 값할당에 쓰면 항상 표현식의 마지막 값을 반환한다 

   
var num = (5, 1, 3, 8, 0); // num에는 0이 저장된다 




3.6 문장
ECMAScript에 '제어문'이라고 정의된 몇가지 문장이 있다.


3.6.1 if문

if (condition) {
 statement1
} else {
 statement2
}

condition(조건)에는 어떤 표현식이든 사용가능하며 불리언 값으로 평가되지 않는것도 자동으로 해당 표현식의 결과에 Boolean() 함수를 호출해 불리언 값으로 바꾼다.
condition이 true로 평가되면 statement1을 실행하고 false로 평가되면 statement2가 실행된다.


3.6.2 do-while문(평가전 루프)

루프의 종료 조건을 평가하기 전에 루프 본문을 실행하는 루프로 최소 한번은 반드시 실행된다

do {
 statement
} while (expression);


3.6.3 while문(평가후 루프)
루프 본문을 실행하기 전에 종료 조건을 평가하는 루프로 루프 본문을 단 한번도 실행하지 않을 수도 있다.

while (expression) {
 statement
}


3.6.4 for문(평가후 루프)
루프에 들어가기 전에 변수를 초기화 할수 있으며 루프 코드도 지정할수 있다

for (initializetion; expression; post-loop-expresstion){
 statement
}

for루프는 조건 표현식이 true로 평가될 때만 실행하므로 while문과 마찬가지로 루프 본문의 코드를 실행하지 않을 때도 있고 루프 본문을 실행하면 루프 후 코드 역시 실행하여 변수(i)의 값을 바꾼다.


3.6.5 for-in문
엄격한 반복문으로 for-in문은 객체의 프로퍼티를 나열하는데 사용한다.

for (var property in expression) {
 statement
}



3.6.6 문장레이블
label : statement



3.6.7 break 문과 continue 문
break 문과 continue 문을 통해 루프내부의 코드 실행을 세밀히 조절할수 있다.
break문은 즉시 루프에서 빠져나가 루프 다음 문장을 실행하는 반면 continue문은 루프를 즉시 빠져나가긴 하지만 루프 실행은 계속된다.

var num = 0;
for (var i = 1; i < 10; i++){
 if(i % 5 == 0){
  break;
 }
 num++;
}



3.6.8 with문
코드의 스코프를 특정 객체에 고정하여 사용하므로 특정 객체를 코드에서 자주 참조할때 편리하게 작성하자는 의도로 사용한다.

with (expresstion) {
 statement;
}

with문 내부의 변수는 우선 지역변수로 간주하지만 지역변수에서 식별자로 찾을수 없다면 location 객체의 프로퍼티 중에서 같은 이름으로 검색하여 location 객체의 프로퍼티로 평가된다.
스트릭트 모드에서는 width문을 금지하며 문법 에러로 간주하고 성능에 악영향이 있어 with문을 쓰는것은 좋지않은 사례로 간주한다.


3.6.9 switch문

switch문은 if문과 관련이 깊고 C기반 언어의 문법과 매우 비슷하다

switch (expression){
 case value : statement
  break;
 case value : statement
  break;
 case value : statement
  break;
 default : statement
}


switch문의 각 case는 '표현식이 value와 일치하면 statement를 실행하라'는 의미다.
break 키워드를 만나면 코드 실행을 멈추고 switch 문을 빠져나가라는 의미로 break 키워드를 쓰지 않으면 다음 case를 계속 평가한다.
default 키워드는 case 중 value로 평가되는 것이 없을 때 실행한 문장을 가리키는 else문과 같은 역할을 한다.


각 case 문은 불리언 값을 반환하므로 각 case 문을 순서대로 평가하면서 true인 것을 찾거나 default 문을 만날때까지 진행한다.
switch 문은 일치 연산자(===)로 값을 비교하므로 타입 변환은 일어나지 않는다




3.4 함수
함수는 문장을 캡슐화하여 언제든 실행할 수 있게 하는 모든 언어의 핵심으로 ECMAScript 에서 함수는 function 키워드로 정의하며 그 뒤에 매개 변수와 함수 본문을 순서대로 쓴다.

function functionName(arg0, arg1, ..., argN){
 statement
}

함수는 이름으로 호출하며 매개변수를 넘길 땐 괄호 안에 넣는데 매개변수가 여러개라면 쉽표로 구분한다.

   
 funtion sayHi(name, message){
 alert("Hello" + name + "," + message);
}
sayHi("Nicholas", "how are you today?");





함수를 호출하면 "Hello Nicholas, how are ypu today?"가 표시된다.

ECMAScript의 함수는 꼭 값을 반환하지 않아도 되고 모든 함수는 언제든 return 문 뒤에 반환할 값을 써서 값을 반환할 수 있다. 

   
 
   
 

function sum(num1, num2){  return num1 + num2;  alert("Hello world"); // 실행되지 않음 }
var result = sun(5, 10); // result: 15




return 문 뒤에 반환값을 쓰지 않아도 되는데 이렇게 하면 return 문을 만나는 즉시 멈추고 undefined 값을 반환하므로 일반적으로 함수에서 값을 반환할 필요가 없고 함수 실행을 멈추기만 할 때 return 문의 반환값을 생략하여 사용한다.
함수는 항상 값을 반환하거나 항상 반환하지 않도록 일관성있게 작업해야 혼란이 없고 디버그하기 쉽다.


스트릭트 모드에서는 함수에 여러가지 제한이 있다.
- 함수 이름과 매개변수 이름에 eval 이나 arguments는 사용할수 없다.
- 서로 다른 매개변수에 결코 같은 이름을 쓸 수 없다.



3.7.1 매개변수의 이해
ECMAScript는 매개변수 숫자를 따지지 않고 데이터 타입도 체크하지 않는다.
매개변수가 배열로 표현되기 때문에 함수에서 매개변수를 두 개 받도록 만들었더라도 반드시 두개가 아닌 한 개, 세 개, 또는 아에 넘기지 않아도 에러로 간주하지 않는다.
이 배열은 항상 함수에 전달되지만 함수는 배열에 어떤 값이 들어있는지 체크하지 않는다.
함수는 arguments라는 객체를 하나 갖는데 이 객체를 통해 매개변수 값에 접근할 수 있고 arguments[0], arguments[1] 형태로 접근하며 매개변수 갯수를 length 프로퍼티를 통해 알수 있다는 면에서 배열처럼 동작하기는 하지만 Arrat의 인스턴스는 아니다. 

   
function sayHi(){
 alert("Hello" + arguments[0] + "," + arguments[1]);
} 



위 함수와 같이 name과 message 매개변수를 쓰지 않아도 같은 결과를 얻을수 있다.
ECMAScript에서는 매개변수에 이름을 붙인다고 해서 함수 시그니처를 만들고 나중에 검사하지 않기 때문에(유효성 검사를 하지 않는다) 이름 붙은 매개변수는 편리하긴 하지만 반드시 필요한것은 아니다.

arguments 객체의 length 프로퍼티를 통해 함수에 매개변수가 몇개 전달되었는지 알수 있고 이런 방법을 통해 개발자는 함수가 넘겨받는 매개변수에 맞게 반응하는 코드를 만들수 있다.
또한 arguments 객체를 이름 붙은 매개변수와 함께 쓸수 있다.



3.7.2 오버로딩 없음
ECMAScript 함수에는 다른 언어에서 사용하는 오버로딩이 없다.





 

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

참조타입  (0) 2014.10.17
객체에 대한 이해  (0) 2014.10.15
변수와 스코프, 메모리  (0) 2014.10.07
HTML 속의 자바스크립트  (0) 2014.09.23
자바스크립트란 무엇인가  (0) 2014.09.22

어휘구조

2014. 9. 24. 13:28 나홀로스터디/JS 완벽가이드


2장 어휘구조

이 포스팅은 "자바스크립트 완벽 가이드(인사이트, 송인철,이동기,이유원,황인석 옮김)"에서 발췌 요약한 것입니다.
 
2.1 문서 집합
2.2 대소문자 구분
2.3 공백과 줄나눔
1.4 기타 환경에서의 자바스크립트
2.4 선택적인 세미콜론 사용
2.5 주석
2.6 리터럴
2.7 식별자
2.8 예약어

프로그램 언어의 어휘구조는 프로그램을 어떻게 작성해야 하는지를 명시하는 기본적인 규칙이다.



문서 집합
자바스크립트 프로그램은 16비트 Unicode 문자 집합을 사용하여 작성되므로 지구상에 사용되는 대부분의 문자를 표현할 수 있다.


대소문자 구분
자바스크립트는 대소문자를 구분하는 언어다.
HTML에서는 대소문자를 구별하지 않지만 XHTML과 자바스크립트는 대소문자를 구별하여 사용한다.


공백과 줄나눔
자바스크립트는 프로그램 내 토큰 사이의 스페이스나 탭, 줄바꿈 등을 무시한다.


선택적인 세미콜론 사용
세미콜론은 각 문장을 구분하는 역할을 한다.


주석

// 한 줄짜리 주석

/* 이것도 주석이다
* 또 다른 주석
* 여러 줄에 걸쳐 있다.
*/


리터럴
리터럴은 프로그램에 직접 나타나는 데이터 값으로 리터럴 없이는 프로그램을 작성할수 없다.

1.2 // 숫자 1.2
"hello world" // 문자열
true // 불리언 값
/javascript/gi // '정규표현식'리터럴
null // 객체가 존재하지 않음

ECMAScript에서는 배열과 객체 리터럴을 위한 표현식도 지원한다

{ x:1, y:2 } // 객체 초기자
[ 1,2,3,4,5 ] // 배열 초기자


식별자
식별자는 간단히 말해 이름을 말하는데 자바스크립트에서 식별자는 변수나 함수에 이름을 붙이거나 코드 내 루프 문에 레이블을 붙이는데 사용된다.
사용규칙은 첫글자는 알파벳(letter), 밑줄(_) 혹은 달러 표시($)여야 한다. 숫자는 허용되지 않는다.


예약어
자바스크립트에는 몇가지 예약되어 있는 키워드들이 존재하는데 이것은 식별자(변수이름, 함수이름, 루프 레이블)로 사용할 수 없는 단어들이다. 자바스크립트에서 미리 정의된 전역 변수나 함수 이름을 식별자로 사용하는 경우 에러가 발생하거나 기존 변수나 함수를 재정의 하는것이 된다.

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

문장  (0) 2014.10.16
표현식과 연산자  (0) 2014.10.13
변수  (0) 2014.10.07
데이터 타입과 값  (0) 2014.10.01
자바스크립트 소개  (0) 2014.09.23

HTML 속의 자바스크립트

2014. 9. 23. 16:58 나홀로스터디/JS For Web Dev


2장 HTML 속의 자바스크립트

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
2.1 <'script> 요소 사용
2.2 인라인 스크립트와 외부 스크립트의 비교
2.3 문서 모드가 자바스크립트에 미치는 영향
2.4 자바스크립트가 비활성화된 상황에 대한 대비


2.1 <script> 요소 사용
<script>요소는 async, charset, defer, language, src, type 여섯가지 속성이 있다.
async와 defer속성은 외부 스크립트 파일을 불러올 때만 유효하고 charset와 language속성은 거의 사용하지 않는다. src속성은 외부 파일의 위치를 지정하고 type속성은 브라우저 호환성을 위해 "text/javascript"로 표기하나 기본값이므로 생략 가능하다.

<script> 요소는 두가지 방법으로 사용한다.
페이지에 직접 작성하는 인라인 자바스크립트 코드는 위에서부터 차례로 해석되며 스크립트 요소 내부의 코드 전체를 평가하기 전에는 페이지의 나머지 콘텐츠를 불러오지도 표시하지도 않는다.

인라인 스크립트를 파싱하는 방식때문에 "/"문자를 \로 이스케이프해서 해결한다.

자바스크립트를 외부에서 불러오려면 src속성을 사용하고 마찬가지로 외부파일 코드를 해석하는 동안은 페이지 처리가 멈춘다.

<script type="text/javascript" src="example.js"></script> 


중요: <script>와 </script> 태그 사이에 스크립트 코드가 있고 src 속성도 사용했다면 브라우저는 스크립트 파일을 내려받아 실행하며 인라인 코드는 무시한다.


2.1.1 태그위치
외부파일을 한곳에서 관리하기 위한 목적으로 전통적으로 <script>요소는 페이지 <head> 요소 안에 쓰는것이 일반적이나 <body>를 만나기전 자바스크립트 코드를 내려받고 파싱하고, 해석이 끝날때까지 렌더링이 지연되는 것을 이유로 최신 웹 애플리케이션에서는 자바 스크립트 코드를 모두 <body> 요소 안에, 페이지 콘텐츠 마지막에 쓴다.


2.1.2 스크립트 처리 지연(defer 속성)
defer속성을 설정하면 브라우저는 즉시 코드를 내려받지만 실행은 지연한다. 하지만 현실에서는 defer 속성으로 지연시킨 스크립트가 항상 순서대로 실행되지 않고 html5를 지원하는 브라우저는 인라인 defer속성을 무시한다. 따라서 지연시킬 <script>요소는 하나만 쓰고 맨 마지막에 놓는것이 최선이다.


2.1.3 비동기 스크립트(async 속성)
스크립트를 내려받아 실행할 때까지 기다릴 필요없이 페이지 렌더링을 시작해도 좋다는 명시이므로 파일 사이에 의존성이 있으면 제대로 실행되지 않을수 있다. DOM을 조작하는 스크립트는 비동기적으로 불러오지 않는것이 좋다.


2.1.4 XHTML에서 바뀐 점
확장성 있는 하이퍼텍스트 마크업 언어 XHTML은 HTML에 XML을 적용한 것으로 HTML보다 엄격한 규칙으로 <script>요소의 콘텐츠를 파싱하는 규칙이 적용되지 않는다.
따라서 < 기호를 태그의 시작으로 간주하여 < 기호다음에는 공백문자가 올수 없으므로 발생하는 문법에러를 해결하기 위해서는 < 기호를 HTML 엔티티 &lt;로 변경하거나 CDATA 섹션으로 자바스크립트 코드를 감싸는 방법이 있다.
XHTML 비호환 브라우저에서 CDATA 섹션을 지원하지 않는 문제를 해결하기 위해 CDATA 마크업앞에 주석기호 //를 사용한다.

 

2.2 인라인 스크립트와 외부 스크립트의 비교

- 외부파일 사용의 이점


 

2.3 문서 모드
인터넷 익스플로러 5.5는 '쿽스모드'와 '표준모드' 두 가지 문서모드를 도입했다. 두 모드 사이의 중요한 차이는 콘텐츠 렌더링으로 자바스크립트에도 영향이 있다. 이후 등장한 '거의 표준모드'는 표준모드의 대부분을 지원하나 엄격하지 않고 테이블에서 사용한 이미지 주변의 공백을 어떻게 처리하느냐의 차이가 크게 나타난다.

문서 시작에 독타입을 쓰지 않으면 모든 브라우저는 쿽스모드를 사용하고, '거의 표준'모드는 트랜지셔널이나 프레임셋 독타입에서 사용된다. 표준 모드와 '거의 표준'모드는 거의 유사하기 때문에 '표준 모드'는 쿽스모드를 제외한 둘이라고 생각해도 무관하다.

 

2.4 자바스크립트가 비활성화된 상황에 대한 대비(noscript 요소)
<noscript> 요소는 브라우저가 자바스크립트를 지원하지 않을때 대체 콘텐츠를 제공하기 위한 것으로 <script> 요소를 제외한 html 요소를 포함할수 있다.

브라우저가 스크립트를 지원하지 않거나 스크립트 지원이 꺼져있는 상황이 되면 <noscript> 요소의 내용이 렌더링 된다.


 

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

참조타입  (0) 2014.10.17
객체에 대한 이해  (0) 2014.10.15
변수와 스코프, 메모리  (0) 2014.10.07
언어의 기초  (0) 2014.10.01
자바스크립트란 무엇인가  (0) 2014.09.22
Copyright © HuckleberryM All Rights Reserved | JB All In One Designed by CMSFactory.NET