问答

JSON.stringify()处理一个对象的时候,忽略了对象中的方法,怎么

作者:admin 2021-06-27 我要评论

const a = { test: 1, func() { console.log(1111) }}const b = JSON.stringify(a)console.log(b) // {"test":1} 如示例,在对一个包含function的对象进行JSON.s...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
const a = {
    test: 1,
    func() {
        console.log(1111)
    }
}
const b = JSON.stringify(a)
console.log(b) // {"test":1}

如示例,在对一个包含function的对象进行JSON.stringify()时,function会被忽略掉,请问如何解决这种问题

###

JSON 是一种数据的序列化、反序列化方案,而 function 不是数据,就更不是 JSON 的合法内容了。所以被舍弃掉才是正常的,没有“问题”,不需要“解决问题”。

如果你出于某种非常不合理的需求,需要把一个 function 序列化了,可以自己约定一种序列化方式。比如先 toString() 转成字符串;反序列化时 eval

function function2string(obj) {
   if (!(obj instanceof Object))
       throw new Error('不是对象,无法转换。');

   if (obj === null)
       return null;

   const result = {};
   for (let prop in obj) {
       if (typeof obj[prop] === 'object') {
           result[prop] = function2string(obj[prop]);
       } else if (typeof obj[prop] === 'function') {
           result[prop] = {
               '@type': 'function',
               'value': obj[prop].toString()
           }
       } else {
           result[prop] = obj[prop];
       }
   }
   
   return result;
}

const sample = function2string({
   func: function() {
       console.log(a);
   }
});

console.log(JSON.stringify(sample));

反序列化就不写了,反过来 eval 就好了。

注:这种方式仅对自定义函数有效,对 ES 中内置函数无效。

image.png

###

自己写个深拷贝方法。或者用lodash

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • JSON.stringify()处理一个对象的时候,

    JSON.stringify()处理一个对象的时候,

  • linux下运行vulkan程序黑框?

    linux下运行vulkan程序黑框?

  • React 热重载后css样式问题

    React 热重载后css样式问题

  • 通过el-upload上传excel文件,后端(nod

    通过el-upload上传excel文件,后端(nod

腾讯云代理商
海外云服务器