Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 除了Set和Map之外,还有哪些常见的JS类不能很好地处理JSON.stringify()?_Javascript_Node.js_Ecmascript 6 - Fatal编程技术网

Javascript 除了Set和Map之外,还有哪些常见的JS类不能很好地处理JSON.stringify()?

Javascript 除了Set和Map之外,还有哪些常见的JS类不能很好地处理JSON.stringify()?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,在地图或集合上调用JSON.stringify时,会得到空数据: console.log(JSON.stringify({foo: new Map([[1,2], [3,4]])})); 我们刚刚得到: {"foo":{}} 我可以使用以下方法或多或少地解决上述问题: console.log(JSON.stringify({foo: Array.from(new Map([[1,2], [3,4]]))})); 但我的问题是——除了Map和Set之外,还有其他核心JS类不能自动序列化吗?J

在地图或集合上调用JSON.stringify时,会得到空数据:

console.log(JSON.stringify({foo: new Map([[1,2], [3,4]])}));
我们刚刚得到:

{"foo":{}}
我可以使用以下方法或多或少地解决上述问题:

console.log(JSON.stringify({foo: Array.from(new Map([[1,2], [3,4]]))}));

但我的问题是——除了Map和Set之外,还有其他核心JS类不能自动序列化吗?

JSON只支持:字符串、数字、布尔值、null和数组以及作为值/属性的普通对象。就这样。因此,除了JSON直接支持的对象之外,没有其他类型的对象由其他对象组成

您必须手动将对象转换为可以用JSON中的这些基本类型表示的对象,或者找到其他方法来表示对象。对象(如具有简单值/索引的映射)中的数据可以手动转换为JSON格式(可能是在对象数组或数组数组中),但在反序列化时必须手动将其转换回映射

您可以在这里看到JSON支持的类型:

这意味着没有自定义对象类型,即使其实例数据仅由上述类型组成,也不会反序列化为正确的对象类型。这甚至包括
日期
正则表达式
之类的对象,当然也包括任何非普通对象,如
集合
,或
映射

可以手动将数据转换为JSON可序列化的内容,然后手动反序列化为适当的对象。例如,可以序列化非嵌套的
映射
,该映射只包含以下合法键和值:

function serialize(mapOrSet) {
    if (mapOrSet instanceof Map) {
         // convert Map into 2D array
         // [[key1, val1], [key2, val2], ....]
         let data = [];
         for (const [key, value] of mapOrSet) {
             data.push([key, value]);
         }
         return JSON.stringify({
             _customType: "Map",
             _data: data
         });
    } else if (mapOrSet instanceof Set) {
         return JSON.stringify({
             _customType: "Set",
             _data: Array.from(mapOrSet);
         }); 
    } else {
         throw new TypeError("argument to serialize() must be Map or Set");
    }
}

然后,您必须拥有一个自定义反序列化程序,该程序可以检测具有
\u customType
属性的对象,并调用适当的反序列化程序函数将普通JSON转换为适当的自定义对象类型。您甚至可以通过让对象支持它们自己的序列化和反序列化功能,使用某种
\u customType
属性来标识要调用的适当类名,从而使系统具有可扩展性。当然,源和目标都必须有适当的序列化和反序列化扩展才能正常工作。

Date对象浮现在脑海中。和符号。是的,但它们没有任何特殊的表现方式;它们只是JSON输出中的字符串,因此当你解析JSON时,你仍然只有字符串。似乎问题的区别在于产生有用JSON序列化的类与无用JSON序列化的类。由此可知:
Date
s,functions,
undefined
Infinity
,RegExps,map,set,blob,filelist,ImageData、稀疏数组、类型化数组和其他复杂类型。是的,这就是我所说的接收器需要知道如何将其转换回的意思。JSON的大部分价值在于自动转换为语言类型。