1、如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。
2、如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
3、如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
5、JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
6、如果对象中存在循环引用的情况也无法正确实现深拷贝。
这1-6都是因为什么原因,才会得到这样的结果呢?
你所有问题的答案都是规定如此(规定见图):
其实就是 JSON 支持的数据类型跟 JS 比那是天差地别的,要少太多了,具体有哪些看文档:https://developer.mozilla.org...
【补充】
楼下说是因为 JSON 的设计初衷的轻量级的缘故,这个说法倒是没问题,说白了就是设计者当时没考虑那么多。
其实不需要扩展额外的语法,只需要包装一下完全能解决问题,比如:
如果某些语言的标准库没有类似 Date 的数据结构,就 Fallback 退化成普通的 Object 处理,这也完全没有什么问题。
你要非说这么做就“不轻”了,那没有问题;但真的很“重”吗?
P.S. 其实社区已经有扩展性更好的"JSON"了,比如 BSON,同样也是标准化的序列化方案。各个语言也都有丰富且良好的实现,只不过 JS 没内置 API、需要你引入第三方库罢了。