코락 CoRock
코딩하는 락스타
코락 CoRock
  • 분류 전체보기 (394)
    • frameworks (19)
      • spring (19)
      • spring-boot (0)
      • testing (0)
    • languages (94)
      • java (39)
      • kotlin (0)
      • python (42)
      • r (13)
    • libraries (0)
    • programming (239)
      • android (13)
      • c (17)
      • cpp (22)
      • database (18)
      • design-pattern (4)
      • data-structures (11)
      • git (8)
      • hadoop (6)
      • html-css (7)
      • issue (4)
      • javascript (26)
      • jsp (34)
      • os (29)
      • php (6)
      • preferences (19)
      • etc (15)
    • discography (37)
      • k-pop (18)
      • pop (19)
    • blog (4)

블로그 메뉴

  • Programming
  • Java
  • JavaScript
  • Discography
  • K-Pop Songs
  • Pop Songs
  • Blog
  • Guestbook

공지사항

인기 글

태그

  • python
  • 파이썬
  • jsp
  • r
  • oracle
  • Android
  • javascript
  • linux
  • 자바스크립트
  • CentOS
  • Java
  • Spring

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
코락 CoRock

코딩하는 락스타

[33-js-concepts] 3. 값 타입과 참조 타입 (Value Types and Reference Types)
programming/javascript

[33-js-concepts] 3. 값 타입과 참조 타입 (Value Types and Reference Types)

2019. 11. 21. 13:58
반응형

1.값

 원시타입 ( boolean, null, undefind, string,number, symbol)

원시타입은 immutable data type 이기 때문에 ,값이 변경될 경우, 새로운 값을 할당을 받음.

 

let myNumber=23; 

let newVar = myNumber;

myNumber = myNumber+1;





2. 참조

객체타입 ( object)

메모리상의 실제 객체의 위치를 나타내는 주소값을 할당받음.

 

let myArray =[];

[

let vs const 

 : 변수할당이 나온 김에 번외



let sum=0;

sum = 1+2+3+4+5;

 

let numbers=[];

numbers.push(1)

numbers.push(2)

numbers.push(3)

numbers.push(4)

 

let 과 const 의 사용에서의 차이  : 변화 발생 시, let <-> 변화 발생 x, const

 => 여기서의 변화란, 메모리 주소값의 변화를 말함

즉, let은 메모리 주소값이 변하는 경우, const는 메모리 주소값이 변하지 않는 경우 

 

=> 참조타입에서 직접적으로 변수에 대입 값을 변경하지 않고, 참조하는 위치가 가르키는 곳의 값을 변경시, const를 이용 가능

 

[const value]

 

[const reference]

 : myArray가 가르키는 주소값이 변경되는 것이 아닌, 가르키는 주소값내의 값 변경.

ex) const myArray={};

myArray[‘newKey’]= ‘someValue’ ; // 가능

 

]



**유의점

      1. 할당받은 값내의 변수값 변경 가능 (실제 가르키는 주소값을 변경하는 경우가 아닌 경우에만)

      2. 할당 변수 변경 불가능 , 새로운 값 할당시, 다른 주소값을 가지게 됨

  => 참조값을 함수내에서 immutable 하게 이용하기 위해서![immutable data partten] : 불변 데이터 패턴

      1. 객체를 immutable 하게 변경

=> 불변 객체화 (Object.freeze)

ex) Object.freeze(target) : 객체의 내부 property 변경 불가능

 

 

그러나 nested Object는 변경가능

 

 

=> 해결법 : Deep freeze

      1. 값의 사본은 생성( 같은 값을 가진 새로운 참조변수 생성) 

=> 방어적 복사(Object.assign)

ex) Object.assign(target, ...sources) : target property <- sources property

     return value : target object

           i. immutable.js 사용

          : List, Stack, Map, OrderedMap, Set, OrderedSet, Record와 같은 영구 불변 (Permit Immutable) 데이터 구조를 제공

 

__ 참고

** 내부 프로퍼티 구조 :https://v8.dev/blog/fast-properties



__ 예시

var a=[1,2,3];

var b=a;

console.log(a===b)

 

b=[4,5,6];

console.log(a===b)

----------------------------------------------------------------------------------------------------------

 function foo(x){

 x.push(4);

 console.log(x);

 

 x=[4,5,6];

 x.push(7);

 console.log(x);

}

 

var a=[1,2,3];

foo(a);

console.log(a);

----------------------------------------------------------------------------------------------------------

 function foo(x){

 x.push(4);

 console.log(x);

 

 x.length=0;

 x.push(4,5,6,7);

 console.log(x);

}

 

var a=[1,2,3];

foo(a);

console.log(a);




** == & ===

값의 경우, ==를 사용하게 되면 ,해당 변수의 값을 비교

참조의 경우, == 를 사용하게 되면, 해당 변수가 가진 값은 주소값임으로, 그 주소값이 가르키는 실제 데이터의 값을 비교하는 것이 아님! => 실제 값까지 비교시, === 이용

++ 외의 방법

 : stringify 를 사용하여 동일하게 문자열로 변환하여 비교

 : isEqual(value, other)  + custom - isEqualWith(value, other, [customerizer])

 ( https://lodash.com/docs/4.17.15#isEqual )

반응형
저작자표시 비영리 변경금지
    'programming/javascript' 카테고리의 다른 글
    • [33-js-concepts] 5. == vs. === vs. typeof
    • [33-js-concepts] 4. 명시적 변환, 암시적 변환, Nominal, 구조화, 덕 타이핑 (Implicit, Explicit, Nominal, Structuring and Duck Typing)
    • [33-js-concepts] 2. 원시 자료형 (Primitive Types)
    • [33-js-concepts] 1. 호출 스택 (Call Stack)
    코락 CoRock
    코락 CoRock
    A COder dreaming of being a ROCKstar

    티스토리툴바