본문 바로가기
반응형

JavaScript9

Set으로 중복 지웠는데 같은 ID가 남아요: 객체 참조와 남길 행을 정해요 객체 배열을 new Set에 넣었는데 같은 ID가 여전히 두 줄인가요? Set은 객체 안의 id를 읽어 중복을 판단하지 않아요. 서로 따로 만든 객체는 속성 내용이 비슷해도 다른 객체로 남아요. ID를 기준으로 하나만 남기려면 그 ID를 키로 쓰고, 첫 행과 마지막 행 중 어느 쪽을 보존할지도 정해야 해요.같은 객체 두 번과 같은 ID 두 번은 결과가 달라요const first = { id: "A", name: "old" };const separate = { id: "A", name: "new" };console.log(new Set([first, first]).size);console.log(new Set([first, separate]).size);console.log(first === separat.. 2026. 10. 29.
JavaScript 기본값을 넣었더니 0이 3으로 바뀌어요: ||와 ??가 고르는 값 자동 재시도를 0번으로 저장했는데 프로그램에서는 3번으로 바뀌었다면, 기본값을 넣은 줄을 먼저 보세요. value || 3은 0도 오른쪽 값으로 바꿔요. 0과 false를 유효한 설정으로 살리고, null이나 undefined일 때만 기본값을 쓰려면 ??가 그 의도에 맞아요.재시도 횟수와 소리 설정은 아래에서 만든 가상의 예시예요. 어떤 서비스의 실제 옵션 이름이 아니라, 값이 바뀌는 지점을 확인하기 위한 작은 객체입니다.비어 있는 값과 꺼 둔 값이 섞이는 순간const settings = { retries: 0, sound: false };console.log(settings.retries || 3, settings.sound || true);console.log(settings.retries ?? 3.. 2026. 10. 29.
map(parseInt)에서 12가 1이 됐어요: 배열 인덱스가 진법으로 들어가요 문자열로 받은 수량 10·11·12를 숫자로 바꾸려고 map(parseInt)를 썼는데 마지막 값이 1이 됐어요. map은 값뿐 아니라 인덱스도 콜백에 넘기고, parseInt는 그 두 번째 인수를 진법으로 받아요. parseInt(value, 10)를 호출하는 함수를 사이에 두면 이 인수 충돌을 막을 수 있어요.NaN만 찾는 검사로는 놓칠 수 있다는 점이 더 곤란해요. 잘못된 변환의 결과가 평범한 숫자 1일 수도 있기 때문이에요. 자체 문자열 배열로 어느 호출에서 값이 달라지는지 확인해 볼게요.세 번째 칸은 오류 표시 없이 틀릴 수 있어요const values = ["10", "11", "12"];const converted = values.map(parseInt);console.log(converte.. 2026. 10. 28.
URLSearchParams에서 +가 공백이 돼요: 문자열 조립과 set의 입력이 달라요 검색창에는 A+B를 넣었는데 다음 화면에는 A B로 넘어오나요? URLSearchParams에 q=와 검색어를 이어 붙인 문자열을 주면, 값 안의 +도 쿼리 구문의 일부로 읽혀 공백이 될 수 있어요. 원래 값은 set이나 append에 그대로 넘기고, 쿼리 문자열을 만드는 일은 API에 맡기는 편이 안전해요.이 차이는 특수한 암호 문자열에만 생기지 않아요. 상품명, 검색어, 사용자가 붙여넣은 코드처럼 +가 실제 내용인 값에서도 확인할 수 있어요. 외부 서버 없이 자체 검색어 A+B C를 세 경로로 보내 볼게요.생성자에 넣은 문자열은 이미 쿼리 구문이에요const keyword = "A+B C";const parsed = new URLSearchParams(`q=${keyword}`);console.log.. 2026. 10. 28.
JSON.parse 뒤 주문번호 끝자리가 바뀌어요: 큰 정수 ID는 문자열 계약부터 확인하세요 응답 원문에는 주문번호 끝자리가 93인데 JavaScript에서 읽으면 92로 보이나요? 큰 정수를 JSON 숫자로 받아 Number로 바꾸는 과정에서 정밀도를 잃은 경우를 확인해 볼 만해요. 나중에 String으로 바꿔도 이미 달라진 숫자의 끝자리를 되찾는 것은 아니에요.계산할 수량과 그대로 보존할 식별자는 역할이 달라요. 특히 큰 주문 ID를 주고받는다면 보내는 쪽과 받는 쪽이 숫자·문자열 중 무엇을 약속했는지부터 봐야 해요. 실제 주문 정보 없이 자체 숫자로 확인해 볼게요.원문은 정확해도 파싱 결과는 달라질 수 있어요const raw = '{"orderId":9007199254740993}';const parsed = JSON.parse(raw);console.log(parsed.orderId);c.. 2026. 10. 27.
Promise.all이 실패했는데 다른 작업은 계속돼요: catch와 취소는 달라요 여러 작업을 Promise.all로 기다리다가 catch에 들어왔는데, 잠시 뒤 다른 작업의 완료 로그가 찍히나요? 이상한 재실행이라고 단정하기 전에 원래 작업이 계속 진행 중이었는지 확인해 보세요. Promise.all의 결과가 거부돼도 다른 작업이 자동으로 취소되지는 않아요.따라서 catch는 묶음의 실패를 알리는 곳이에요. 모든 작업이 실패했다거나, 이미 끝난 일이 되돌아갔다는 증거는 아니에요. 외부 전송·저장이 있는 묶음이라면 전체 재시도 전에 각 작업의 상태가 특히 중요해요.실패를 먼저 확인하고, 남은 작업은 나중에 끝내 볼게요아래 코드는 외부 서버 없이 실행할 수 있어요. slow를 끝내는 함수를 따로 보관하고, catch가 실행된 다음 직접 완료시켜요. 실제 시간 지연이나 인터넷 속도에 기대.. 2026. 10. 27.
반응형