티스토리 뷰

728x90
SMALL

데이터 타입 : 프로그램 언어로 다룰 수 있는 값의 종류

타입은 크게 원시 타입과 객체 타입으로 나뉜다.

원시 타입 : 숫자, 텍스트의 나열(문자열), 불리언, null, undefined

null과 undefined는 원시 값이긴 하지만 하나의 형식으로 봐야 한다.

객체 타입 : 이름과 값을 갖는 프로퍼티의 집합

일반적인 객체는 순서가 없는 값들의 집합이며, 각 값에는 이름이 지정되어 있다.

자바스크립트는 배열이라는 특별한 종류의 객체를 정의한다. 배열은 순서가 있는 값들의 집합이며, 각 값에는 번호(index)가 부여된다.

자바스크립트는 함수라는 특별한 객체를 정의한다. 함수는 실행 코드를 가지고 있는 객체로서, 실행 코드를 수행하고 계산된 값을 반환한다.

 

생성자 함수 : 새로 생성된 객체를 (new 연산자를 이용항) 초기화하기 위해 사용되는 함수

생성자는 객체들의 클래스를 정의한다. ex) Array, Function, Date, RegExp, Error

자바스크립트 인터프리터는 메모리 관리를 위해 자동으로 가비지 컬렉션을 수행한다.

자바스크립트는 객체 지향 언어이다. 넓은 의미에서 이는, 다양한 타입의 값을 다루는 전역 함수를 정의해두기보다, 어떤 값과 작동하는 메서드를 해당 타입 스스로 정의해둔다. ex) sort(a)xxx  a.sort();

기술적으로 자바스크립트 객체만이 메서드를 소유한다. 하지만 숫자, 문자열, 불리언은 메서드를 가진 것처럼 동작하고 null, undefined는 유일하게 메서드를 가질 수 없는 값이다.

원시 타입과 객체 타입은 메서드를 가진 타입과 그렇지 않은 타입으로 나뉜다.

원시 타입과 객체 타입은 수정 가능한 타입과 그렇지 않은 타입으로 나뉜다.

자바스크립트의 값은 타입 변환이 자유롭다.

자바스크립트 변수들은 타입이 정해져 있지 않다.

숫자

정수 리터럴

다른 프로그래밍 언어들과는 다르게 자스는 정수 값과 실수 값을 구분하지 않는다. 오직 실수만

64비트 실수 형태로 표현하지만 배열 인덱싱이나 비트 연산에서는 32비트 정수로 수행한다.

숫자 리터럴 : 변수에 할당하기도 하고 또는 있는 그대로 사용하기 하는 숫자

자스에서 10진수 정수는 숫자 시퀀스 형태로 작성된다. 10진수 리터럴 이외에도 16진수 값을 인식한다. 8진수로도 표현할 수 있지만 Strict Mode에서는 금지하고 있다.

부동소수점 리터럴

부동소수점 리터럴은 소수점을 가질 수 있고, 이는 실수를 표현하는 전통적인 문법을 사용한다.

산술 연산

산술 연산자에는 +, =, *, /, %가 있고 Math 객체를 통해 지원하기도 한다.

자스에서 산술 연산은 오버플로(Infinity)와 언더플로, 0으로 나누는 에러를 발생시키지 않는다.

양의 무한대 : Infinity

음의 무한대 : -Infinity

언더플로 : 가장 작은 값보다 더 0에 가까울 때 0을 돌려준다.

0/0인 경우 NAN을 반환한다.

NAN은 그 자신뿐만 아니라 다른 값과 같은지 비교할 수 없다.

ex) x==NAN XXX;       x!=x;

isNana() : NAN이거나 숫자가 아니면 참

isFinite() : 인자가 NAN, Infinity, -Infinity 이 외의 숫자라면 참

Math~~

이진 부동소수점과 반올림 오류

자바스크립트에서는 한정된 숫자만 부동소수점 형태로 표현할 수 있다. 따라서 반올림 오류가 있다.

ex) 0.3-0.2와 0.2-0.1은 다르다.

날짜와 시간

코어 자바스크립트는 날짜와 시간을 표현하는 객체를 생성하기 위해 Date() 생성자를 제공한다.

텍스트

문자열은 16비트 값들이 연속적으로 나열된 것으로, 각 문자는 수정할 수 없는 유니코드 문자로 표현된다.

배열와 문자열은 0기반 인덱싱

자스는 문자 하나를 하나의 타입으로 제공x

하나의 16비트 값을 표현하기 위해서는 길이가 1인 문자열 사용

문자열 리터럴

자스에서 문자열 그대로를 포함하려면 작은 따옴표 혹은 큰 따옴표로 둘러싸면 된다.

작은 따옴표는 큰 따옴표에 큰 따옴표는 작은 따옴표에 포함될 수 있다.

\n으로 한 줄을 여러줄로 작성할 수 있다.

어포스트로피(')는 작은 따옴표와 같기 때문에 escape 시키기 위해서 역슬래시를 사용해야 한다.

자스와 마찬가지로 HTML도 따옴표를 구분하기 때문에 섞어서 사용할 때는 다른 것을 사용하자

문자열 리터럴의 이스케이프 문자열

역슬래시 문자는 뒤따라 나오는 문자와 결합될 경우 다른 방식으로는 표현할 수 없는 문자를 표현한다.

문자열 다루기

문자열에 +를 적용하면 이어 붙인다.

s.length : 길이

s.toUpperCase()         // => "HELLO, WORLD"

문자열은 읽기 전용 배열처럼 취급될 수 있고, 대괄호 대신 charAt() 메서드를 사용하여 개별 문자에 접근 가능

s[0]; s[s.length-1];

패턴 매칭

자스는 문자 패턴을 나타내는 객체를 생성하기 위해 RegExp() 생성자를 정의한다. 이런 패턴은 정규 표현식에 기술되어 있고, 자스는 정규 표현식을 위해 펄(Perl)의 구문을 채택한다. 문자열과 RegExp 객체는 모두 패턴 매칭과 검색 후 바꾸기 기능을 수행하는 메서드를 가지고 있다.

RegExp가 자스의 기본 데이터 타입은 아니지만, 자스는 정규식에 대한 리터럴 문법을 가지고 있고 이는 자스 프로그램을 바로 해석될 수 잇다.

불리언 값

true와 false이다.

if else문은 true일 때 if문 동작 false일때 else문 동작

undefined, null, 0, -0, NaN, ""은 모두 false 값으로 변하고

모든 객체를 포함하여 모든 값은 true처럼 동작한다.

&&, ||, ! 연산자

null과 undefined

null은 보통 아무 값도 갖지 않음

typeof null은 object이다. null은 객체가 아님을 뜻하는 특수한 객체 값

null은 객체 뿐 아니라 숫자와 문자열에 값이 없음을 가리킬 때 사용

 

undefined는 값 자체가 없다는 뜻

초기화 되어 있지 않거나, 존재하지 않는 객체 프로퍼티나 배열의 원소 값에 접근하려고 할때 얻는 변수 값

반환 값이 없는 함수와 인자가 없는 함수 매개변수의 값에 의해 반환

미리 선언된 전역 변수(null처럼 언어 차원의 키워드가 아닌)

typeof undefined는 undefined이다. => undefined는 특별한 고유값

 

시스템 레벨에서 예기치 않거나 값이 없어서 에러를 나타낼 때 등에는 주로 undefined 사용

일반적인 프로그램 레벨에서 예상되는 값이 없을 때는 null 사용

만약 이들 값 중 하나를 변수나 프로퍼티에 할당할 필요가 있거나 함수에 인자로 전달할 필요가 있다면, undefined보다는 null 사용하는게 적절

전역 객체

전역 객체는 매우 중요한 용도로 사용되는 일반적인 자바스크립트 객체다.

전역 객체의 프로퍼티는 자바스크립트 프로그램 전역에서 사용할 수 있게 정의된 심벌이다.

1. undefined, Infinity, NaN 같은 전역 프로퍼티(예약어가 아니지만 예약어처럼 취급된다.)

2. isNaN(), parseInt(), eval() 같은 전역 함수들

3. Date(), RegExp(), String(), Object(), Array() 같은 생성자 함수

4. Math와 JSON 같은 전역 객체

최상위 코드(함수의 부분이 아닌)에서 전역 객체를 참조하기 위해 this를 사용할 수 있다.

클러이언트 측 자스에서 Window 객체는 브라우저 창에 포함된 모든 자스 코드를 위한 전역 객체다. 이 객체는 this 대신 사용될 수 있고, 자기 자신을 참조하는 window 프로퍼티도 가지고 있다. 또한 전역에서 사용되는 프로퍼티들을 정의할 뿐만 아니라, 웹브라우저와 클라이언트 측 자스에서 사용되는 몇가지 전역 객체들도 정의하고 있다.

레퍼 객체

자스 객체는 복합적인 값이다. 객체 안의 값들은 프로퍼티 또는 이름있는 값들의 집합이며 표기법을 사용하여 프로퍼티의 값을 참조한다. 프로퍼티의 값이 함수일 때, 이 함수를 메서드라 부른다.

왜 문자열은 객체도 아닌데 프로퍼티를 가지고 있을까? s의 프로퍼티를 참조하려고 할 때, 자스는 new String(s)를 호출한 것처럼 문자열 값을 객체로 변환한다. 이 객체는 문자열 메서드를 상속하고 프로퍼티 참조를 살펴보는 데 사용된다. 일단 프로퍼티 참조가 해제되면 새로 생성된 임시 객체는 메모리에서 회수된다. 숫자와 불리언도 마찬가지

 null과 undefined 값의 레퍼 객체는 없다.

var s="test";
s.len=4;
var t=s.len; //undefined

2행은 임시 String 객체의 len 프로퍼티에 4를 할당한다. 그리고 임시 객체를 회수한다.

3행은 기존 문자열 값과 같은 값을 가진 새로운 String 객체를 생성하고 len 프로퍼티를 읽으려고 한다.

따라서 undefined

보통 레퍼 객체는 Number 또는 Boolean 객체에서 String 객체와 문자열, 숫자 또는 불리언 값을 구별하는데 필요

var s="test", n=1, b=true;
var S=new String(s);
var N=new Number(n);
var B=new Boolean(b);

일반적으로 S,N,B는 s,n,b처럼 작동하지만 ===으로 엄격한 동등 연산자로 구분할 수 있다.

typeof를 해보면 S,N,B는 object이다.

new를 빼면 완전같다

원시 타입과 참조 타입

자스에서 원시 타입과 참조 타입은 근본적인 차이점이 있다. 원시 타입의 값은 수정할 수 없다.

문자열의 원소를 변경할 수 있다고 생각할 수도 있지만 문자열을 수정하는 메서드는 새로운 문자열을 반환한다.

원시 타입은 값으로 비교되서 같은 값을 가지고 있다면 두 값은 같다. 하지만 문자열은 다르다.

서로 다른 문자열을 비교할 때 자스는 두 문자열의 길이가 같고 각 인덱스에 있는 문자들이 같다면 두 문자열을 같다고 판단한다.

 

객체는 자신의 값을 변경할 수 있다.(mutable)

객체는 값으로 비교되지 않는다. 즉 같은 프로퍼티와 값을 가지고 있어도 같지 않다.

객체는 참조 타입으로 불린다. 두 객체 값은 그들이 같은 객체를 참조한다면 같다.

객체를 변수에 할당하는 것은 단순히 참조를 할당하는 것이다. 이는 새로운 복사본을 생성하지 않는다.(얇은 복사)

서로 다른 객체 또는 배열을 서로 비교하고 싶다면 그들의 프로퍼티 또는 원소를 비교해야 한다.

타입 변환

자스는 타입에 대해 매우 유연하다.

10+ "objects" // "10 objects"
"7"*"4"       // 28
var n=1-"x";  // NaN
n+" objects"  // "NaN objects"

변환과 동등 비교

undefined가 불리언 값이 올 자리에 사용되면 undefined는 false로 변환한다. but 이것이 undefined가 false임을 의미x

if문은 undefined를 false로 변환하지만, ==연산자는 피연산자를 불리언으로 변환하지 않는다.

null==undefined
"0"==0
0==false
"0"==false

명시적 변환

명시적으로 타입 변환을 수행하는 가장 간단한 방법은 Boolean(), Number(), String(), Object() 함수를 사용하는 것이다.

new 연산자 없이 호출되면, 이 함수들은 변환 함수로 작동하고 위의 표에 요약된 변환을 수행한다.

null과 undefined를 제외한 모든 값은 toString() 메서드를 가지고 있다.

x+""  //String(x)와 같다.
+x    //Number(x)와 같다. 결과는 x=0이다.
!!x   //Boolean(x)와 같다.

Number 클래스에 정의된 toString()메서드는 기수를 정하는 선택적 인자를 받는다. default는 10

var n=17;
binary_string=n.toString(2);
octal_string="0"+n.toString(8);
hex_string="0x"+n.toString(16);

Number 클래스는 숫자를 문자열로 변환하는 세 가지 메서드를 정의한다. (적절히 반올림 함)

toFixed() 메서드 : 소수점 이후에 정의된 수와 문자열로 숫자를 변환. 지수 표기법 사용x

toExponential() 메서드 : 지수 표기법 사용. 소수점 앞에 숫자 하나와 소수점 뒤에 지정된 만큼의 자릿수를 놓는 방식으로 숫자를 문자열로 전환

toPrecision() 메서드 : 여러분이 정의한 유효 자릿수로 숫자를 문자열로 변환

var n=123456.789;
n.toFixed(0);        //"123457"
n.toFixed(2);        //"123456.78"
n.toExponential(1);  //"1.2e+5"
n.toPrecision(4);    //"1.235e+5"

여러분이 문자열을 Number() 변환 함수로 넘긴다면, 변환 함수는 문자열을 정수 혹은 실수 리터럴로 해석할 것이다.

하지만 Number() 함수는 10진수 정수로만 동작하고 숫자 리터럴의 일부가 아닌 문자를 허용하지 않는다.

한편 parseInt()와 parseFloat() 함수(전역함수)는 리터럴의 일부가 숫자가 아니어도 된다는 점에서 Number()보다 유연

parseInt() : 정수, parseFloat() : 정수와 부동소수점.   앞 부분 공백 무시, 숫자 다음에 나오는 문자 무시

parseInt()는 해석될 숫자의 기수(밑)를 정의하는 선택적인 두 번째 인자를 받는다.(2~36)

ex) parseInt("11",2);  //3

객체에서 원시 타입으로 변환

객체에서 불리언으로의 변환은 간단한다. 모든 객체는 true로 변환된다.(레퍼 객체 동일)

객체에서 문자열로 그리고 객체에서 숫자로의 변환은 변환될 객체의 메서드를 호출함으로써 수행된다.

어렵...

 

변수 선언

자스에서는 var로 변수를 선언한다. ,로 여러 개의 변수를 선언할 수 있다.

선언과 동시에 초기화를 할 수 있다.

초기 값을 지정하지 않는다면, 변수는 undefined이다.

for, for/in 루프 안에 올 수도 있다.

var 문장에서는 변수를 하나 이상 선언할 수 있다. 변수를 선언하지 않고 사용할 수 있지만 추천하지 않는다.

변수의 유효 범위

변수의 유효범위란 프로그램에서 어떤 변수가 정의되어 있는 영역을 말한다.

전역 변수의 유효범위는 전역적이다.

반면 어떤 함수 안에서 선언된 변수는 오직 해당 함수 몸체 안에서만 정의된다.(지역변수)

함수의 매개 변수도 지역 변수이다.

함수 정의는 중첩될 수 있다.

 

함수 유효범위와 끌어올림(Hoisting)

C 같은 프로그래밍 언어에서 블록 안에 있는 코드는 자신만의 유효범위를 가지며, 변수는 해당 변수가 선언되지 않은 블록 밖에서는 보이지 않는다. 이를 블록단위의 유효범위라 부르며, 자스에서는 유효하지 않다.

대신 자스는 함수 유효범위를 가지고 있다. 변수는 이 변수가 정의된 함수 안에서 보일 뿐 아니라 이 함수 안에 중첩된 함수 안에서도 보인다.

자스에서 함수의 유효범위는 함수 안에서 선언된 모든 변수가 합수 전체에 걸쳐 유효하다. 이는 변수가 선언되기 전에도 유효하다. 이를 비공식적으로 호이스팅(Hoistin)이라고 한다.

var scope="global";
function f(){
    console.log(scope);  //global이 아니라 undefined출력
    var scope="local";   //변수를 여기서 초기화하지만 전역적으로 정의된다.
    console.log(scope);  //local을 출력
}

//실제로는
function f(){
    var scope;
    console.log~~
    scope=~~
    console.log~~
}

프로퍼티로서의 변수

여러분이 전역 변수를 선언할 때, 실제로는 전역 객체의 프로퍼티를 정의하는 것이다. 그래서 delete로 삭제할 수 x

자스는 this 키워드로 전역 객체를 참조할 수 있도록 한다. 하지만 지역 변수가 저장된 객체를 참조할 다른 방법은 주지 않는다. 지역 변수를 가지고 있는 객체들의 세부사항은 우리가 신경 쓸 필요 x

유효범위 체인

자스는 언어적으로 유효범위를 가지고 있는 언어다. 변수의 유효범위란 변수가 정의된 소스코드의 집합으로 생각할 수 있다. 전역 변수는 프로그램 전체에 걸쳐 정의된다. 지역 변수는 변수가 선언된 함수 내에서 전체에 걸쳐 정의되고 또한 중첩된 함수 내에서도 정의된다.

우리가 지역 변수를 잘 정의된 객체의 프로퍼티로 생각한다면, 변수 유효범위를 다른 관점으로 볼 수도 있다. 자스의 모든 청크(전역 코드 또는 함수)는 그것과 연관된 유효범위 체인을 가지고 있다. 자스가 변수 x의 값을 얻어야 할 때 처음 체인에 있는 객체에서 x를 찾기 시작한다. 만약 있다면 사용하고 없다면 체인에 있는 다음 객체에서 찾는다. 이를 반복하고 x가 유효범위 체인 안에 있는 객체의 프로퍼티가 아니라면 x는 유효범위 안에 없기 때문에 ReferenceError가 발생

함수를 호출할 때마다 유효범위 체인이 조금씩 달라진다. 물론 중첩된 함수의 코드는 항상 동일하지만, 유효범위 체인과 관련된 코드는 함수를 호출할 때마다 달라진다. 이 개념은 with 구문과 클로저를 이해하는데 중요하다.

728x90
LIST

' > 자바스크립트 완벽 가이드' 카테고리의 다른 글

7장 배열  (0) 2020.11.08
6장 객체  (0) 2020.11.07
5장 구문  (0) 2020.11.06
4장 표현식과 연산자  (0) 2020.11.05
2장 어휘구조  (0) 2020.11.02
댓글
공지사항