所有javascript变量JSON都可以序列化吗?

所有javascript变量JSON都可以序列化吗?,javascript,json,Javascript,Json,JSON.stringify能否将任何javascript变量转换为文本? 或者是否存在限制(功能、原型等) 返回未定义的;JSON不支持函数 JSON.stringify(/JSON.stringify/) 这将返回“{}”;stringify跳过不可枚举的属性 JSON.stringify(JSON) 这将返回“{}”;stringify跳过返回不支持值的属性 JSON.stringify(JSON.JSON = JSON) 这引发了一个例外;JSON不支持循环引用。 如果在转换过程中

JSON.stringify能否将任何javascript变量转换为文本? 或者是否存在限制(功能、原型等)

返回未定义的;JSON不支持函数

JSON.stringify(/JSON.stringify/)
这将返回
“{}”
;stringify跳过不可枚举的属性

JSON.stringify(JSON)
这将返回
“{}”
;stringify跳过返回不支持值的属性

JSON.stringify(JSON.JSON = JSON)
这引发了一个例外;JSON不支持循环引用。

如果在转换过程中遇到未定义的函数或XML值,则会将其忽略(在对象中找到时)或删除为null(在数组中找到时)


限制包括字符串化包含触发异常的循环引用的对象

JSON.stringify(document);
// TypeError: Converting circular structure to JSON

你的问题有两个答案:

  • 简单回答:不,请参阅各种反例(如DOM对象、函数,只需在提示中亲自尝试即可)
  • 复杂的回答:是的,JSON.stringify可以将任何javascript表达式转换为任何JSON子表达式。没有重大限制
需要注意的是,默认情况下它无法做到这一点,而且它也无法以任何标准化的方式做到这一点。具体请参见此处的
replacer
参数,该函数类似于:

function(key,value) {
    if (SPECIALLOGIC) {
        // ... return some special value
        //  like {__SPECIAL__:'datetime', value:'some_custom_encoding'}
    } else
        return value;
}

不完全正确(关于复杂的答案)-JSON.stringify不会转换循环数据结构。例如:
varx={};变量y={link:x};x、 link=y不会被字符串化。卡米特尔:谢谢;我意识到,可能应该对此做个旁注。在技术上(通过努力),我认为可以将循环引用具体化为特殊记录(通过遍历树,将所有内容放入hashmap),然后在取消序列化时重建引用。
function(key,value) {
    if (SPECIALLOGIC) {
        // ... return some special value
        //  like {__SPECIAL__:'datetime', value:'some_custom_encoding'}
    } else
        return value;
}