有没有人为Internet Explorer和其他非Gecko浏览器实现Mozilla的Object.toSource()方法?我正在寻找一种将简单对象序列化为字符串的轻量级方法.
请考虑以下事项:(使用FireFox 3.6时)
javascript: x=function(){alert('caveat compter')}; alert(['JSON:\t',JSON.stringify(x),'\n\ntoSource():\t',x.toSource()].join(''));
显示:
JSON:
toSource():( function(){alert("caveat compter");})
甚至:
javascript: x=[];x[3]=x; alert('toSource():\t'+x.toSource()); alert('JSON can not handle this at all and goes "infinite".'); alert('JSON:\n'+JSON.stringify(x));
显示:
toSource():#1 = [,,,#1#]
并且"go'无限'"消息跟随JSON的stackoverflow递归离题.
这些示例强调了由toSource()呈现的JSON表示中明确排除的表达式的微妙之处.
对于所有情况,组合程序来复制相同的结果并不容易,因为Gecko toSource()原语非常强大.
下面是一些复制到Source()功能的程序必须成功处理的"移动目标":
javascript: function render(title,src){ (function(objRA){ alert([ title, src, '\ntoSource():',objRA.toSource(), '\nJSON:',JSON.stringify(objRA) ].join('\n')); })(eval(src)); } render('Simple Raw Object source code:', '[new Array, new Object, new Number, new String, ' + 'new Boolean, new Date, new RegExp, new Function]' ); render( 'Literal Instances source code:', '[ [], 1, true, {}, "", /./, new Date(), function(){} ]' ); render( 'some predefined entities:', '[JSON, Math, null, Infinity, NaN, ' + 'void(0), Function, Array, Object, undefined]' );
显示:
Simple Raw Object source code: [new Array, new Object, new Number, new String, new Boolean, new Date, new RegExp, new Function] toSource(): [[], {}, (new Number(0)), (new String("")), (new Boolean(false)), (new Date(1302637995772)), /(?:)/, (function anonymous() {})] JSON: [[],{},0,"",false,"2011-04-12T19:53:15.772Z",{},null]
然后显示:
Literal Instances source code: [ [], 1, true, {}, "", /./, new Date(), function(){} ] toSource(): [[], 1, true, {}, "", /./, (new Date(1302638514097)), (function () {})] JSON: [[],1,true,{},"",{},"2011-04-12T20:01:54.097Z",null]
最后:
some predefined entities: [JSON, Math, null, Infinity, NaN, void(0), Function, Array, Object, undefined] toSource(): [JSON, Math, null, Infinity, NaN, (void 0), function Function() {[native code]}, function Array() {[native code]}, function Object() {[native code]}, (void 0)] JSON: [{},{},null,null,null,null,null,null,null,null]
如果需要简单的良性人类消费以查看对象的内部结构,那么如果翻译是"要使用"或不那么严格,则之前的分析是重要的.作为表示,主要JSON功能是在环境之间传输一些"要使用"的结构化信息.
toSource()函数的质量是影响但不限于:
往返计算,最小不动点属性和反函数的程序的指称语义中的一个因素.
重复的代码转换是否静止到静态?
obj.toSource()== eval(eval(eval(obj.toSource()).toSource()).toSource()).toSource()?
考虑obj == eval(obj.toSource())是否有意义?
是否撤消转换结果,而不仅仅是类似的对象,而是IDENTICAL?
这是一个加载的问题,在克隆操作对象时会产生深远的影响.
还有很多......
请注意,当obj包含已执行的代码对象时,上述问题具有更多意义,例如(new Function ...)()!
如果匹配Firefox的确切序列化格式不是您的目标,您可以使用http://json.org上列出的JavaScript JSON序列化/反序列化库之一.使用像JSON这样的标准方案可能比模仿专有的Gecko格式更好.
如果需要使用循环引用序列化对象,可以使用https://github.com/douglascrockford/JSON-js上的 Douglas Crockford对JSON对象的cycle.js扩展.这非常类似于Source(),虽然它不会序列化函数(但可能适用于使用函数的toString方法).