使用 JSON.Stringify 序列化数据的坑

786 阅读1分钟

方法介绍

JSON.Stringify是日常开发中常用到的JSON对象中的一个方法。JSON对象有两个方法,一个是 解析JSON字符串的parse();一个是将对象转换成字符串的stringify()。在这里就列举一下使用 JSON.Stringify的几个注意事项。

示例

以一个涵盖了大部分数据类型的对象为例:

let my_obj = {
    func: function () {
        alert(1);
    },
    obj: { a: 1 },
    arr: [1, 2, 3],
    und: undefined,
    reg: /123/,
    date: new Date(0),
    NaN: NaN,
    infinity: Infinity,
    sym: Symbol(1)
};
Object.defineProperty(my_obj, "innumerable", {
    enumerable: false,
    value: "innumerable"
});

console.log("obj1", obj1);
let str = JSON.stringify(my_obj);
let my_obj2 = JSON.parse(str);
console.log('obj2',my_obj2);

运行结果如下: JSON.stringify前后数据对比

使用 JSON.stringifyJSON.parse的数据,前后变化表明,使用JSON.stringify序列化之后的数据,在JSON.parse会丢失部分数据。

JSON.stringify序列化数据的注意事项

  • 使用JSON.Stringify 转换的数据中,如果包含 functionundefinedSymbol,这几种类型,不可枚举属性, JSON.Stringify序列化后,这个键值对会消失

  • 转换的数据中包含 NaNInfinity 值(含-Infinity),JSON序列化后的结果会是null

  • 转换的数据中包含Date对象,JSON.Stringify序列化之后,会变成字符串

  • 转换的数据包含RegExp 引用类型序列化之后会变成空对象

  • 无法序列化不可枚举属性

  • 无法序列化对象的循环引用,(例如: obj[key] = obj)。

  • 无法序列化对象的原型链

注意: 虽然 JSON.Stringify 使用起来简单又方便,但是,在使用 JSON.Stringify 要考虑到以上问题,避免给自己挖坑。