1 분 소요

데이터타입 / 참조

원시 데이터 타입과 객체

객체가 아닌 데이터 타입을 원시 데이터 타입이라고 한다. 그 외의 모든 데이터 타입들은 객체다.

  • 숫자 / 문자열 / 불리언(true/false) / null / undefined

레퍼 객체(wrapper object)

        var str = 'coding'
        console.log(str.length);
        console.log(str.charAt(0));

위에서 문자열은 원시 데이터 타입이기때문에 객체가 아니라고 하였다.

하지만 위 예제에서는 .연산자(Object access Operator)를 통하여 객체처럼 사용하고있다.

이것은 원시 데이터 타입이 그 데이터 타입과 관련된 작업을 하려고 할 때 자바스크립트는 임시로 문자열 객체를 만들고 사용이 끝나면 제거하기 때문이다. 이러한 처리는 내부적으로 일어난다.

        var str = 'coding'
        str.prop = 'everybody';
        console.log(str.prop);		//undefined

str.prop를 하는 순간에 자바스크립트 내부적으로 String객체가 만들어진다.

prop프로퍼티는 이 객체에 저장되고 이 객체는 곧 제거 된다. 그렇기 때문에 prop라는 속성이 저장된 객체는 존재하지 않게된다.

이렇기에 문자열과 관련해서 필요한 기능성을 객체지향적으로 제공해야 하는 필요 또한 있기 때문에 원시 데이터 형을 객체러럼 다룰 수 있도록 하기 위한 객체를 자바스크립트는 제공하고 있는데 그것이 레퍼객체(wrapper object)다.

  • 숫자 -> Number
  • 문자열 -> String
  • 불리언 -> Boolean

Null과 undefiend는 레퍼객체가 존재하지 않는다.

참조

복제

        var a = 1;
        var b = a;
        b = 2;
        console.log(a);

a라는 상자에 1이 담겨있고, 그것을 똑같이 복제를하고 복제된 새로운 박스가 b이기 때문에,

b의 값을 변경해도 a의 값은 변함이 없다.

참조

        var a = {'id':1};
        var b = a;
        b.id = 2;
        console.log(a.id); // 2

변수에 객체가 담겨져있다면 두 변수 모두 같은 객체를 참조하게 된다.

그렇기 때문에 b의 id를 2로 변경해도 똑같이 a도 바라보고 있었던 id가 변경되게 된다.

        var a = {'id':1};
        var b = a;
        b = {'id':2};
        console.log(a.id); // 1

b에서도 새 객체를 만들게 되면 서로 참조하는 객체가 다르기 때문에 변경해도 a의 객체는 변경되지 않는다.

원시 데이터의 복제는 값을 변경해도 서로 영향을 끼치지 않지만,

객체의 복제는 값을 변경해도 같은 객체를 참조하고 있기 때문에 영향을 미친다.

함수와 참조

        var a = 1;
        function func(b){
            b = 2;
        }
        func(a);
        console.log(a);		// 1

위 예제에서 a가 인자로 들어가면서 a=1 -> b=a -> b=2 과정을 거치면서

원시 데이터값이기 때문에 서로 영향을 끼치지 않는다. 떄문에 a는 1이 나온다.

        var a = {'id':1};
        function func(b){
            b = {'id':2}
        }
        func(a);
        console.log(a.id);      // 1

위 예제에서는 객체이지만 b = {‘id’:2}로 새 객체를 참조하기 때문에 a의 값에는 변함이 없다.

        var a = {'id':1};
        function func(b){
            b.id = 2;
        }
        func(a);
        console.log(a.id);      // 2

하지만 b.id로 값을 변경하면 a가 참조하는 객체와 똑같기 때문에 값에 변함이 생긴다.

댓글남기기