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。