json.stringify将稀疏数组空位转为null,而非undefined或跳过;可用in操作符区分空位(false)与undefined元素(true),json.parse会丢失稀疏性。

JSON.stringify 遇到稀疏数组(sparse array)时,会把空位(elision)转成 null,而不是 undefined 或跳过。这种行为容易被误读为“数组里存了 null”,其实只是序列化过程中的规范映射——关键在于区分“空位不存在”和“值为 undefined”。
看输出结果直接识别
对一个含空位的数组调用 JSON.stringify,观察字符串中是否出现连续的 null:
-
JSON.stringify([1, , 3])→"[1,null,3]" -
JSON.stringify(new Array(3))→"[null,null,null]" -
JSON.stringify([, , , 5])→"[null,null,null,5]"
只要字符串里有 null 出现在方括号内、且前后是逗号分隔(不是属性值),基本可判定原始数组存在空位。
结合 in 操作符验证原始结构
序列化结果不能反推原始是否稀疏,但你可以用 in 操作符检查原始数组:
-
arr = [1, , 3]; 1 in arr→false(索引 1 是空位,无该属性) -
arr = [1, undefined, 3]; 1 in arr→true(索引 1 存在,值为 undefined)
如果 JSON.stringify(arr) 输出了 null,而 i in arr 对应位置返回 false,就确认是稀疏数组的空位所致。
注意 JSON.parse 的“稠密化”副作用
反序列化会把 null 变成真实元素,导致稀疏性丢失:
-
arr = new Array(5); JSON.stringify(arr)→"[null,null,null,null,null]" -
JSON.parse(JSON.stringify(arr))→ 得到长度为 5 的稠密数组,每个索引都存在,值为null - 此时
0 in arr从false变为true,map、forEach也会遍历全部 5 项
避免误判:undefined 不会出现在 JSON 字符串中
undefined 作为数组元素时,JSON.stringify 一律忽略或转为 null:
-
[1, undefined, 3]→"[1,null,3]"(undefined 被转 null) -
{ a: undefined }→"{}"(属性被完全忽略)
所以看到 null,不能直接断定原值是 undefined;它可能来自空位,也可能来自显式赋值的 undefined,需配合 in 或 hasOwnProperty 判断。










