Учитывайте следующее: (при использовании 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 #]
и сообщение о «идущем бесконечном», откуда следует рекурсивное отступление JSON в стеке потока.
В примерах подчеркиваются тонкости выражения, явно исключенные из представления JSON, которые отображаются в toSource ().
Нелегко составить программу для воспроизведения тех же результатов, для ВСЕХ случаев, что и примитив Gecko toSource (), который является исключительно мощным.
Ниже приведены несколько «движущихся целей», которые ДОЛЖНА успешно обрабатывать программа, дублирующая функциональность toSource ():
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 ())?
- Отменяет ли преобразование результат, а не
просто похожий объект, но
ИДЕНТИЧНЫЙ?
Это загруженный
вопрос с глубокими последствиями
при клонировании оперативного объекта.
и многое, многое другое ...
Обратите внимание, что приведенные выше вопросы приобретают дополнительное значение, когда obj содержит объект исполняемого кода, такой как (новая функция ...) ()!