Разбор JSON - eval () или объект функции? - PullRequest
1 голос
/ 26 августа 2010

Для анализа JSON, я считаю, что лучший способ - использовать встроенную поддержку JSON в браузерах.

Я искал хороший способ анализа JSON в тех случаях, когда встроенная поддержка JSON недоступна.

Когда я посмотрел на код в https://github.com/douglascrockford/JSON-js/blob/master/json2.js,, я понял, что сначала он проверяет, являются ли данные действительными JSON, используя регулярное выражение:

if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, '')))

, а затем применяет eval ().

jQuery выполняет $ .parseJSON (), сначала 1-й, используя приведенное выше регулярное выражение, чтобы проверить, является ли он действительным JSON, и затем применяет:

return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
        (new Function("return " + data))();

если доступен нативный JSON, он использует это, в противном случае он использует "Новая функция ".

Больше нигде я не нашел об использовании объектов функций для анализа JSON.Какой метод лучше - использовать eval () или объект функции?Можете ли вы объяснить, что именно выполняет (new Function("return " + data))();?

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

new Function("return "+data) делает почти то же самое, что и eval в этом случае.Где eval возвращает результат напрямую, (new Function("return "+data))() создает анонимную функцию и выполняет ее.

Я не сделал бенчмаркинг, но я думаю, что new Function немного медленнее, чем eval, потому что функция созданаСначала код проверяется.Не верь мне на слово, просто мой мозг думает.

1 голос
/ 26 августа 2010

«новая функция» является более безопасным способом выполнения eval (), с помощью eval все переменные в цепочке областей видимости становятся доступными для кода с подтверждением, не так с «новой функцией», которая использует eval () под капот, но не имеет доступа к переменным в цепочке областей видимости. Переменные должны быть объединены с переданной строкой кода.

(new Function("return " + data))();

По сути, создается функция, которая превращает «данные» в объект и возвращает его, последняя скобка () вызывает функцию немедленно. Поскольку ссылка на созданную функцию не создается, сборщик мусора очищает созданную функцию от стека объектов.

...