要解析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(),检查它是否是有效的JSON,然后应用:
return window.JSON && window.JSON.parse ?
window.JSON.parse( data ) :
(new Function("return " + data))();
如果本机JSON可用则使用它,否则它使用“new Function”。
我找不到使用函数对象解析JSON的其他任何地方。哪个是更好的方法 - 使用eval()或函数对象?你能解释一下(new Function("return " + data))();
的确切表现吗?
答案 0 :(得分:2)
new Function("return "+data)
与eval几乎相同。
eval
直接返回结果的地方,(new Function("return "+data))()
创建一个匿名函数并执行它。
我还没有做基准测试,但我认为new Function
比eval慢一点,因为首先创建一个函数,然后对代码进行评估。不要相信我的话,这只是我的大脑思考。
答案 1 :(得分:1)
'new Function'是一种更安全的方式来执行eval(),使用eval,范围链中的所有变量都可用于evalled代码,而不是使用'new Function',它使用eval()下的eval()引擎盖,但无法访问范围链中的变量。变量需要与传递的代码字符串连接。
(new Function("return " + data))();
基本上,创建了一个函数,它将'data'转换为一个对象并返回它,最后一个括号()立即调用该函数。由于未创建对创建函数的引用,因此垃圾收集器会从对象堆栈清除已创建的函数。