转储JavaScript对象,包括函数体,作为“足够好”的可格式化代码。

9 浏览
0 Comments

转储JavaScript对象,包括函数体,作为“足够好”的可格式化代码。

有很多有关转储JavaScript对象的旧问题。\n但是在指定转储函数内容的问题中,我只能找到将这些函数作为字符串在引号中输出的方法(内部引号已转义)。\n我想要的是以纯粹的JavaScript格式转储对象,包括函数,以便进行漂亮的打印。\n

    \n

  • 不需要像之前的问题一样进行完整的序列化和反序列化。
  • \n

  • 需要将对象显示为文本。只使用console.log()需要交互才能展开对象成员等。在console.log()之后将控制台缓冲区保存为文本不会生成可以进行漂亮打印的纯js语法。
  • \n

  • 对于无法转储的引用(循环引用、DOM引用等),应该发出占位符或类似的内容。不应该在遇到这些引用时抛出错误。
  • \n

\n这是简单方法,它将函数文本转储为带引号的字符串,漂亮的打印程序不会将其格式化为代码:\n

JSON.stringify(someObject, function(key, val) {
  return (typeof val === 'function') ? val.toString() : val;
}, 4);

\n对于测试对象{a: 1, b: \'bb\', c: \"bb\", f: function e() {return \"x\";} },这种简单方法的输出结果为:\n{\n \"a\": 1,\n \"b\": \"bb\",\n \"c\": \"bb\",\n \"f\": \"function e() {return \\\"x\\\";}\"\n}\n\n我需要的是:\n

{
    "a": 1,
    "b": "bb",
    "c": "bb",
    "f": function e() {
        return "x";
    }
}

\n如果之前的答案中有满足我的要求的内容,我很乐意将此问题关闭为重复。我查看了很多答案,但没有找到合适的。\n(用例:创建一个用于第三方网站的TaperMonkey用户脚本。我需要查看实际公开的内容,以找到添加用户脚本钩子的位置。我将对输出进行格式化、打印、加载到代码编辑器等操作)

0
0 Comments

Dump JavaScript object including function bodies as "good enough" formattable code 是一个将包括函数体的JavaScript对象转换为可格式化的代码的问题。这个问题的出现是因为有些JavaScript对象中包含函数体,而JSON.stringify()方法无法正确处理函数体,导致无法将这些对象转换为可格式化的代码。

解决这个问题的方法是使用一些简单的字符串替换。首先,使用JSON.stringify()方法将对象转换为字符串,然后通过一个回调函数对字符串进行处理,将函数体转换为字符串表示。接下来,使用一系列字符串替换操作,将转换后的字符串中的一些特殊字符替换为可读的形式。最后,将处理后的字符串赋值给pre元素的innerText属性,以便在页面上显示出格式化后的代码。如果需要将处理后的字符串转换回对象,可以使用eval()函数进行求值操作。

需要注意的是,这种方法是一种“最后的手段”,因为正则表达式替换操作很容易破坏JSON数据中的其他内容。对于一些包含循环引用的对象,JSON.stringify()方法会报错,这种方法也无法解决这个问题。对于循环引用的处理,可以使用其他方式来检测和解决,但这是一个相对复杂的问题。对于存在循环引用的情况,可以添加一些占位符字符串,以保持代码的格式化。

将包括函数体的JavaScript对象转换为可格式化的代码是一个具有挑战性的问题,但通过一些字符串替换操作可以实现。然而,需要注意在处理过程中可能会导致其他问题,如循环引用的处理。

0
0 Comments

Dump JavaScript object including function bodies as "good enough" formattable code这个问题的出现的原因是因为JSON无法表示函数,因此无法通过JSON.stringify方法得到期望的结果。

解决方法是使用其他方法来实现该功能。由于目标只是特定的浏览器,可以使用uneval或.toSource方法。如果不使用Firefox,可以使用polyfill来解决这个问题。

JSON不同于"JavaScript notation",它有更多的限制。

在尝试解决这个问题时,遇到了一些其他问题,如代码中的一行报错以及跨域访问的问题。这些问题可以通过修改代码来解决,例如修复语法错误或使用XMLSerializer替代JSON-like dumps。

最终,通过在Firefox上使用.toSource方法来得到期望的结果。如果在Chrome上无法找到类似的解决方案,可以考虑切换浏览器来获得对象的输出。

0