값을 담은 구조부터 구별합니다
자바스크립트의 undefined(언디파인드, 정의되지 않은 값)는 JSON이 직접 표현할 수 있는 값이 아닙니다. JSON(제이슨)은 문자열로 자료를 교환하는 형식입니다. JSON.stringify는 자바스크립트 값을 이 형식의 문자열로 바꿉니다. 모든 입력을 모양 그대로 옮기는 복사 기능은 아닙니다.
이 활동은 값 하나를 세 위치에 넣습니다. 객체는 {value: 값}처럼 이름과 값을 짝지으며, 배열은 [값]처럼 순서 있는 칸에 값을 놓습니다. 마지막은 값만 단독으로 넘깁니다. 사용자 정의 변환 함수와 toJSON 메서드는 사용하지 않습니다. 구조를 고정하고 값만 바꾸어 차이를 비교합니다.
같은 undefined도 세 결과가 다릅니다
객체의 value가 undefined이면 그 이름과 값 쌍이 생략되어 결과 문자열은 {}입니다. 배열의 원소가 undefined이면 해당 칸은 null(널, JSON의 빈값 표시)로 바뀌어 [null]이 됩니다. 배열에서 뒤 항목의 위치를 한 칸씩 당기는 방식이 아닙니다.
undefined를 단독으로 넘기면 반환값 자체가 undefined입니다. 화면의 ‘JSON 문자열이 생성되지 않음’은 그 상태를 설명하는 안내 문구이며 실제 JSON 결과가 아닙니다. 결과가 빈 문자열이나 문자열 "undefined"라고 보고하면 또 다른 자료를 만들게 됩니다. 이 셋을 구별하려고 활동은 결과와 반환 자료형을 함께 표시합니다.
null이나 NaN으로 바꾸면 무엇이 보존될까요
값을 null로 바꾸면 객체에서도 value라는 이름이 남아 {"value":null}이 됩니다. 이름이 없는 {}와 이름은 있고 값이 null인 객체는 다릅니다. 이어서 NaN(낸, 유효한 수치가 아님)이나 Infinity(인피니티, 무한대)를 선택하면 기본 변환에서 null로 바뀝니다. 출력만으로 원래 null이었는지 수치 계산에 문제가 있었는지 복원할 수 없습니다.
활동의 0과 문자열 "0"도 비교하세요. 결과의 따옴표는 장식이 아니라 숫자와 문자열을 구별합니다. AI가 외부 전송 전에 확인할 것은 변환 성공 여부뿐 아니라, 어떤 항목이 사라지고 어떤 의미 차이가 합쳐졌는지입니다. 실제 API에서 생략과 null이 각각 ‘유지’인지 ‘삭제’인지 등의 의미는 해당 계약을 따로 확인해야 합니다. 이 글은 그런 서버 동작을 가정하지 않습니다.

