2. FrontEnd/Javascript / / 2025. 2. 27. 15:43

[JS] JSON.stringify(…) 스프레드 연산자를 사용하면?

728x90

[문제]

프로젝트를 하면서, 배열을 stringify를 하면 마지막값만 저장되는 현상이 있음

localStorage.setItem(‘history’, JSON.stringify(…curHistory))
return […curHistory]



[원인]
스프레드 연산지 오용 사용

  • JSON.stringify(…curHistory) = 잘못된 문법


- …curHistory는 배열을 해체하는 문법인데, JSON.stringify는 하나의 값만 받을 수 있음
- 스프레드 연산자는 배열을 개별요소로 해체하기에 올바른 형태가 아님

2. 마지막 값만 저장되는 이유
- 잘못된 스프레드 사용으로 직렬화가 실패하거나, localStorage.setItem이 유효한 데이터를 받지 못해 덮어쓰기가 발생한 것

[해결]
배열 자체를 JSON.stringify에 전달하려면 스프레드 연산자를 사용할 필요가 없음

// 올바른 코드
localStorage.setItem('history', JSON.stringify(curHistory)); 
return [...curHistory]; 
  • JSON.stringify(curHistory) : 배열을 직렬화하여 문자열로 변환
  • return […curHistory] : 배열을 복사하여 새로운 배열 반환

이렇게 하면 기존 배열을 유지하면서 새로운 데이터가 누적됨


예를들어, 데이터 추가시 올바른 방식은
새로운 데이터를 히스토리에 추가 저장하는 상황이라면 아래처럼 써야한다

const curHistory = JSON.parse(localStorage.getItem('history')) || [];

function addHistory(newItem) {
  const updatedHistory = [...curHistory, newItem]; // 새 항목 추가
  localStorage.setItem('history', JSON.stringify(updatedHistory)); // 로컬스토리지에 저장
  return updatedHistory;
}

console.log(addHistory({ url: 'qqq.qqqq' }));

'2. FrontEnd > Javascript' 카테고리의 다른 글

[ JS ] 실행 컨텍스트  (0) 2025.01.17
[JS] MVC패턴 & Flux패턴  (0) 2024.04.03
[JS] 비동기처리 (Promise)  (0) 2023.08.31
[JS] Event Bubbling / Capturing  (0) 2023.08.31
[JS] This의 4가지 역할  (0) 2023.08.31
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유