2016-05-19 3 views
3

У меня проблема с JSON.parse(), которая заключается в том, что он всегда возвращает результат «недоступен». Вот простой пример:Странное поведение JSON.parse() в Firefox

<html> 
    <head> 
    <title>Test</title> 
    <script> 
     var lnkArr=JSON.parse('{}'); 
     console.log('lnkArr: ', lnkArr); 
    </script> 
    </head> 
    <body></body> 
</html> 

Это производит: lnkArr: <unavailable>. Неважно, что я анализирую, результат тот же. Ошибок нет, и тот же код отлично работает в Chrome. Есть ли что-то, что я делаю неправильно здесь или это ошибка?

Кроме того, если кто-то может указать мне на информацию о том, что «недоступно» означает, что я действительно ценю это, потому что все, что я могу найти об этом, говорит о сфере видимости, и ничто ничего не говорит о том, что изменение сферы меняется именно так.

Update

Я использую Firefox Developer Edition 48.0a2 (2016-05-19). Сценарий, связанный с Мартином, дает те же результаты.

+1

Мое предположение, что сборщик мусора был быстрее, чем консоль. Объекты ведения журнала всегда были сложными, но я бы предположил, что журнал предотвращает сбор. –

+1

Я не могу воспроизвести это. Какую версию Firefox вы используете? Вы используете встроенную консоль или Firebug? – JAAulde

+0

Что происходит в вашей консоли здесь: https://jsfiddle.net/tsym2euz/ Я нахожусь в firefox/osx и, похоже, отлично работает –

ответ

2

Ответ от комментариев:

Это вопрос, где консоль иногда не в соответствии с тем, что на самом деле происходит.

Хром, в частности, известно, что консоль представляет собой другой поток в качестве кода JavaScript, и, таким образом, объекты могут меняться или даже собираться с мусором - между тем, как вызывается console.log и когда отображаются результаты.

Использование JSON.stringify можно «копировать» объект так, чтобы он зарегистрирует правильно:

console.log('lnkArr: ', JSON.stringify(lnkArr)); 

Тем не менее, в тот момент времени, lnkArr на самом деле является объектом. Он отображается как строка в консоли, потому что это то, что мы просили, - но это только для целей показа.

var str = '{"prop": true}'; 
 

 
var o = JSON.parse(str); 
 
console.log(JSON.stringify(o)); 
 
console.log('But `prop` is: ', o.prop);