Ответ 1
Учитывайте следующее: (при использовании 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 #]
и сообщение "going" бесконечное ", откуда следует рекурсивное отступление JSON stackoverflow.
В примерах подчеркиваются тонкости выражения, явно исключенные из представления 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() является фактором денотационной семантики программы, влияющей, но не ограничиваясь:
расчеты в оба конца, наименьшие свойства фиксированной точки и обратные функции.
- Повторяется ли конвертация кода quiesce в статическое состояние?
- Выполняет obj.toSource() == Eval (Eval (Eval (obj.toSource()). toSource()). toSource()). toSource()?
- Имеет смысл рассмотреть obj == eval (obj.toSource())?
- Отменяет результат преобразования, а не
просто подобный объект, но
ИДЕНТИЧНЫЙ?
Это загруженный вопрос с глубокими последствиями при клонировании операционного объекта.
и многие, многое другое...
Обратите внимание, что приведенные выше вопросы приобретают дополнительное значение, когда obj содержит исполняемый объект кода, такой как (новая функция...)()!