现代浏览器中的JSON.parse
是否在内部使用eval()
来评估和执行动态代码?
因为我一直在浏览Douglas Crockford的JSON库。它在使用parse()时使用eval()
但在实际评估之前进行预处理。如: -
支持JSON.parse的现代浏览器本身是执行此操作还是遵循其他协议?
答案 0 :(得分:9)
JSON.parse()
不使用eval()
这是设计原因,因为eval()
能够执行您提供的任意JavaScript代码,它可以执行您不希望它执行的操作。所以JSON.parse()
执行它在锡上所说的内容:它实际上解析整个字符串并重建整个对象树。
JSON.parse
通常被委托给用“本机”代码实现的内部函数,其中“native”表示在浏览器的javascript引擎的上下文中被认为是“本机”的(可能是编译的机器代码,可能是VM等字节码...)。我不认为对此有任何强烈要求。
JSON(符号)本身由RFC4627编纂。
关于JSON
对象及其方法的实现,所有现代浏览器的实现应该表现相同,因为它们应遵循ECMAScript 5的JSON object的相同规范{ {3}}。但是,总是存在潜在缺陷的可能性。例如,V8最初包含此nasty bug。
另请注意,上面评论中列出的实现是为了向本机不支持它的浏览器添加JSON.parse()
支持(也称为“您有时需要支持的这些该旧版浏览器”)。但这并不意味着他们必须如何实施它。
例如,对于Chrome中使用的Google V8实施,请参阅json.js,该json_parser.h会调用来自{{3}}的原生代码。
答案 1 :(得分:-1)
如果你想的话,这将是一件非常有趣的事情。
要明白为什么,看看这个类比是否有帮助:你和老板一起旅行到一个你会说这种语言的国家,但事实并非如此。由于你很流利,你将扮演两个角色:作为她的助手(为她做任务)以及她的翻译(告诉她什么意思)。
所以你有这两个互补的工作。你的老板可以告诉你做一些事情 - 用你们都懂的任何语言(比方说,英语) - 以及要求你告诉她什么东西,比如标志或文件。她甚至可以做到这两点:用一种用另一种语言写的说明,然后说:“这是由我信任的人给我的。请在这里说出来。”
在这个类比中,向老板阅读标志或文件就像JSON.parse
。你的老板递给你指示并告诉你做他们说的所有事情就像eval
。
如果JavaScript引擎在eval
内部使用JSON.parse
,那就类似于您的老板询问文档所说的内容,并且您选择执行所有内容该文件是为了向她解释。而不只是阅读它。