[JS] primitive type인 문자열을 생성자로 만든다면?

Park.Dyel·2021년 11월 25일
0

JS

목록 보기
3/3

😛 TL;DR

생성자로 만든 문자열은 primitive 값이 아닌 객체를 가르킵니다.

🤔 중복되는 문자열 데이터를 공유할 수 없을까?

질문의 시작은 오픈톡방에서 시작했습니다.

자바스크립트도 자바처럼 문자열 "a"를 여러번 할당해도 같은 힙메모리 참조하나요? 그리고 메모리주소값을 확인하는 방법이 뭘까요..?? ㅜㅜ

아시다시피 JavaScript에서 String은 primitive한 값입니다. 즉, 문자열을 다른 변수에 대입하면 새로운 값을 가지게 됩니다. 할당한 변수와 할당된 변수 사이에는 어떤 연결고리 없이, 서로 어떤 영향도 주지 않습니다.

let welcomeString = '만나서 반갑습니다!'

const people = [
  {
    name: 'suji',
    welcomeString,
  },
  {
    name: 'jisu',
    welcomeString,
  }
];

반면, C/C++의 경우 문자열 포인터 변수의 경우 주소값을 가지고 있기때문에, 다른 변수에 할당하는 경우 주소값만 복사되기 때문에 두 변수는 같은 곳을 바라보게 되고, 한 변수에서 문자열을 가공하면 다른 변수에도 영향을 주게 됩니다. Java알못이라 정확히 모르지만, Java도 문자열 변수를 다른 변수에 대입하면 참조 주소만 대입된것으로 기억합니다

🎃 멍청한 생각

-- 이하 작성중 --

어디선가 들은 말에 의하면 javascript의 primitive한 type에 대해서는 new를 쓰지 않는것이 좋다고 하여 머릿속에서 지우고 살았다.
하지만 오픈톡방에서 javascript는 java처럼 동일한 내용의 문자열을 공유하지 못하냐고 했을 때, javascript의 String은 primitive한 type이기 때문에 불가능하다는 생각이 먼저 들었다.

하지만 질문하신 분은 열심히 인터넷을 찾으셔서 공유해주셨다. 결국 그는, 내 머릿속에서 new String이라는 무시무시한 녀석을 꺼내주셨다.

MDN에 따르면

Object로 반환한다는 것은 다시 말하면 참조 값이 할당된다는 것이 아닌가?
그래서 과연 정말로 그럴 것인지, 내심 속으로는 설마 되겠어 하는 생각과 함께, 테스트를 해보았다.

테스트 1번

테스트 2번

테스트 3번

참고 String

<html>
<head>
</head>
<body>
<div id="app"></div>
<script>
document.getElementById("app").innerHTML = `
  <button id="test1">테스트1입니다.</button>
  <button id="test2">테스트2입니다.</button>
  <button id="test3">테스트3입니다.</button>
`;

const testString = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam quis est lobortis, cursus magna vel, auctor velit. Nulla gravida, turpis in dignissim condimentum, lectus est eleifend ligula, a rutrum arcu dui eget augue. Quisque vel eros porttitor, vehicula tortor suscipit, molestie ex. Donec mi lorem, semper faucibus nibh a, accumsan fermentum nunc. Suspendisse iaculis commodo sapien, quis congue mauris eleifend eget. Nulla eget tellus iaculis nisi tincidunt elementum. Cras vitae lorem quis metus molestie tristique. Quisque vitae viverra tortor. Aenean tempor pulvinar urna, eu efficitur neque tempor ut. Aenean a faucibus nisl. Pellentesque et augue vestibulum, pulvinar sapien sit amet, euismod leo. Duis vitae ultrices velit, ac lobortis erat.

Ut sit amet ex arcu. Duis fringilla turpis hendrerit consectetur porttitor. Duis eget convallis justo. Etiam ut neque diam. Maecenas lacinia ultricies lacus. Sed scelerisque placerat magna vitae posuere. Aenean ullamcorper rutrum nisi ut auctor. Donec at eros ac justo euismod dapibus id eget odio. Morbi maximus dui sit amet erat sodales, sit amet feugiat justo laoreet. Etiam eu sagittis est, et iaculis tellus. Suspendisse lacinia lorem augue, et tincidunt magna feugiat vel. Aliquam erat volutpat. Curabitur quis euismod turpis. Donec eget viverra magna.

Duis a augue a nisi dapibus feugiat vel hendrerit erat. Sed vel ex nisi. Etiam vel lorem odio. Nam rutrum mi et aliquet dictum. Vestibulum a auctor quam, ut mollis tortor. Proin massa velit, molestie sit amet ex a, egestas tincidunt ante. Pellentesque aliquam dolor diam, in tincidunt risus interdum vel. Nam et erat id lorem pretium volutpat. Quisque nec ante ante. Curabitur viverra nunc id urna bibendum semper. Praesent a nisi vitae arcu iaculis sodales eget vel mauris. Aliquam a justo sed odio cursus venenatis. Quisque tincidunt, lorem a pulvinar pellentesque, diam est condimentum sem, a posuere diam risus convallis ligula. Morbi eleifend urna in dui commodo, vitae molestie erat fermentum. Quisque scelerisque venenatis ultrices.

Cras dignissim bibendum ipsum, tempus placerat elit auctor at. Cras quis ante nibh. Ut a elementum felis, at venenatis dolor. In viverra blandit est eu accumsan. Quisque sit amet eros porta, mollis libero ac, tempus purus. Vestibulum ut vehicula orci, non lobortis velit. Curabitur a semper mauris. Suspendisse pellentesque diam vitae neque viverra, in blandit justo faucibus. Sed et maximus quam, quis laoreet nunc. Quisque consequat, arcu vitae tempor blandit, mi augue pharetra dui, eleifend feugiat ligula sem ut eros.

Phasellus lectus quam, lobortis a ante sit amet, lacinia ornare dui. Vestibulum lobortis lectus ac lorem dignissim, id consectetur nisi viverra. Ut placerat rutrum dui sed hendrerit. Cras euismod sed ex vestibulum aliquet. Ut ullamcorper eget magna et volutpat. Praesent egestas volutpat tortor sit amet ultrices. Phasellus porttitor mauris eget condimentum elementum. Suspendisse vitae turpis id enim dapibus pellentesque. Maecenas metus ex, suscipit eu efficitur eget, molestie sit amet dolor. Donec eu congue magna. Vestibulum condimentum elit mauris, a elementum massa porttitor pulvinar. Curabitur laoreet est ipsum, id dignissim nisi dapibus ac. Suspendisse finibus ligula in laoreet dignissim.`;
const testStringObject = new String(testString)

const testArray1 = [];
const testArray2 = [];
const testArray3 = [];
document.getElementById("test1").addEventListener("click", () => {
  for(let i=0;i<1000; i++){
    testArray1.push(testString);
  }
});

document.getElementById("test2").addEventListener("click", () => {
  for(let i=0;i<1000; i++){
    testArray2.push(testStringObject);
  }
});

document.getElementById("test2").addEventListener("click", () => {
  for(let i=0;i<1000; i++){
    testArray3.push(new String(testString);
  }
});

</script>
</body>
</html>
profile
ㄱH발자

0개의 댓글