JSON字符串化的不一致问题

JSON.stringify({a:undefined})等于'{}'。据此直觉上你可能认为JSON.stringify([undefined])等于'[]',但实际结果却是'[null]'。

JSON.stringify({a:undefined})//{}
JSON.stringify([undefined])//[null]

当我知道对象的键值等于undefined时,这个键值对在JSON字符串化时会被移除,我相当开心。满心欢喜以为如果数组的元素等于undefined,这个元素在字符串化时也会被移除。

因为最近在做一个控制JSON数据段在字符串化时保留或移除的功能。如果只要值是undefined,字符串化时就移除。那我只需遍历把需要移除的数据段的值置为undefined就可以了。剩下都交给内置的JSON.stringify方法。

显然JSON.stringify没有保持一致性和符合直觉。针对数组,需要做如下处理:

const arr=[1,2,3,undefined,5,undefined];

function removeUndefined(arr)
{
    let i=0;
    while(i<arr.length)
    {
        const item=arr[i];
        if(item===undefined)
        {
            arr.splice(i,1);
        }
        else
        {
            i+=1;
        }
    }
}

removeUndefined(arr);
console.log(arr);//[1,2,3,5];
        

在准备写这篇文章的时候,看到JavaScript Weekly 有篇文章也很巧地有讨论到这一点:JSON And The Stringification Oddities In JavaScript