자바스크립트 데이터 타입과 연산자

자바스크립트의 값들은 크게 기본 타입과 참조 타입으로 나뉜다.

자바스크립트 기본 타입

자바스크립트에서 기본타입( 그 자체가 값을 나타냄) 은 숫자 , 문자열 , boolean 과 null , undefined 타입이 있다. 자바스크립트는 느슨한 타입 체크 언어다. 따라서 변수에 어떤 형태의 데이터를 저장하느냐에 따라 해당 변수의 타입이 결정된다.

숫자

자바스크립트에서는 모든 숫자를 64비트 부동 소수점 형태로 저장. 나누기 연산에 주의해야함 . 소수 부분을 버린 정수 부분만을 구하고 싶다면 Math.floor() 메서드를 사용하면 된다.

문자열

자바스크립트에서는 문자하나만을 위한 char형과 같은 타입은 존재하지 않으므로 길이가 1인 문자열 형태로 문자를 표현한다.

한번 정의 된 문자열은 변하지 않는다. 


var str = "test"

str[0] = "T" ;

console.log(str) // test 출력


예제와 같이 한번 정의된 문자열은 읽기만 가능하지 수정은 불가능하다.

불린 값

자바스크립트는 true와 false값을 나타내는 불린 타입을 가진다.

null과 undefined

이 두 타입은 모두 값이 비어있음을 나타낸다. 자바스크립트 환경 내에서 기본적으로 값이 할당되지 않는 변수는 undefined 타입이며 그 값 역시 undefined이다. 


var a ; // undefined 타입

console.log(a) // undefined출력.


null 타입의 변수는 개발자가 명시적으로 값이 비어있음을 나타내는 데 사용한다.

여기서 주의할 점은 null타입의 변수를 typeof로 확인해보면 object 로 출력이 된다. 때문에 값이 null인지 확인할 때에는 typeof 연산자를 사용하면 안되고

일치연산자(===)를 사용해서 값을 직접 확인해야 한다. 


자바스크립트 참조 타입(객체)

자바스크립트에서 객체는 기본타입을 제외한 모든 값이다. 객체는 단순히 " 이름 : 값 " 형태의 프로퍼티들을 저장하는 컨테이너이다.

객체 생성

자바스크립트에서 객체를 생성하는 방법은 크게 세 가지가 있다. 

1. Object() 객체 생성자 함수를 이용하는 방법

2. 객체 리터럴 ( 표기법 ) 을 이용하는 방법

3. 생성자 함수를 이용하는 방법


Object() 생성자 함수 이용

var obj = new Object() ;

객체 리터럴 방식 이용

var obj = {

name : 'troh',

age : 27

};

생성자 함수 이용

4장에서 자세히..

객체 프로퍼티 읽기/쓰기/갱신

프로퍼티에 접근하기 위해서는 마침표(.) 표기법 , 대괄호[] 표기법을 사용하면 된다. 프로퍼티가 표현식이거나( + , - 등등 포함) 예약어(var 등등..)일 경우는 대괄호 표기법만을 사용해야 한다.

for in 문과 객체 프로퍼티 출력

for in 문을 이용하면 객체에 모든 프로퍼티에 대해 루프를 수행할 수 있다.  

객체 프로퍼티 삭제

delete 연산자를 이용하여 객체의 프로퍼티를 삭제할 수 있지만 , 객체 자체를 삭제하지는 못한다.

참조 타입의 특성

객체의 모든 연산이 실제 값이 아닌 참조값으로 처리 된다. 객체를 비교할 때에도 객체의 프로퍼티를 비교하는 것이 아닌 참조값을 비교하며 , 객체 타입에 따라 함수 호출방식도 다르다. 함수를 호출할 떄 기본타입의 값을 전달할 경우 값이 복사 ( call by value ) 되어 전달되지만 참조타입의 값이 전달될 경우에는 객체의 참조값이 전달(call by reference) 된다. 

프로토타입

자바스크립트의 모든 객체는 자신의 부모 역할을 하는 객체와 연결되어 있다. 이러한 부모 객체를 프로토타입 객체 or 프로토타입 이라고한다.

ECMAScript 명세서에는 자바스크립트의 모든 객체는 자신의 프로토타입을 가리키는[[prototype]]라는 숨겨진 프로퍼티를 가진다고 설명하고 있는데 크롬 브라우저에서는 __proto__가 바로 [[prototype]]프로퍼티를 의미한다. 

배열

배열은 자바스크립트 객체의 특별한 형태다.

배열의 생성 및 요소생성

배열의 생성은 배열 리터럴( [] )을 이용하여 생성할 수 있다. 객체가 동적으로 프로퍼티를 생성할 수 있듯이 배열도 동적으로 배열 원소를 아무 인덱스 위치에나 추가할 수 있다. 
모든 배열은 length 프로퍼티를 가지는데 배열의 원소 개소를 나타내는 프로퍼티이지만 , 실제로 배열에 존재하는 원소 개수와 일치하는 것은 아니다.
var arr = [ ];
console.log(arr.length) // 0

arr[0] = 1;
arr[1] = 2;
arr[100] = 101;
console.log(arr.length) // ??
위의 예제의 length프로퍼티의 값(배열의길이)은 101이 출력되지만 실제 원소개수는 3개뿐이다.

배열과 객체

그렇다면 배열과 객체의 차이점은 무엇일까? 배열과 객체의 차이점은 크게 2가지가 있다.

1.length 프로퍼티의 존재 유무

 일반적인 객체는 length 프로퍼티가 존재하지 않지만 모든 배열은 length프로퍼티를 가지고 있다. 객체에다가 length프로퍼티를 추가한다면 어떻게 될까? 이처럼 length 프로퍼티를 가지는 객체를 유사배열객체라고 한다. 


2. 프로토타입

 객체의 프로토타입은 Object 를 가리키지만 배열의 프로토타입은 Array를 가리킨다. 그러므로 유사배열객체 일지라도 프로토타입이 다르므로 배열의 메소드를 이용할 수 없다. 뒤에 나올 apply 와 call을 이용하면 유사배열객체에서도 배열의 메소드를 이용할 수 있다.

배열의 프로퍼티 열거

배열도 프로퍼티를 추가할 수 있다. 객체의 프로퍼티 열거는 for in 문을 이용하여 열거 할 수 있다고 했는데 배열도 for in문을 이용하여 프로퍼티를 열거하면 원치않는 프로퍼티들도 함께 노출이 된다. 따라서 배열의 경우는 for문을 이용하여 프로퍼티를 열거해야 한다

var arr = [1,2,3];

for(int i=0; i<arr.length ; i++)

console.log(arr[i]);

배열 요소 삭제

배열도 객체이므로 delete 연산자를 이용하여 프로퍼티를 삭제할 수 있다. 하지만 delete 메소드는 실제 프로퍼티를 삭제하는 것이 아니고 undefined를 할당할 뿐이다. 그러므로 배열의 원소를 delete로 지워도 length프로퍼티는 변하지 않는다.
원소 자체를 삭제하기 위해서는 splice() 메소드를 이용해서 지울 수 있다.

동등(==)연산자와 일치(===)연산자

동등 연산자는 비교하려는 피연산자의 타입이 다를 경우에 타입 변환을 거친 후 비교하는 반면에 , 일치연산자는 피연산자의 타입이 다를 경우에 타입을 변경하지 않고 비교한다.

대부분의 자바스크립트 코딩가이드에서는 일치연산자를 사용하도록 권장하고 있다.



+ Recent posts