JSON.parse()在内部使用eval()吗?

时间:2013-06-10 12:41:26

标签: javascript jquery json parsing ecmascript-5

现代浏览器中的JSON.parse是否在内部使用eval()来评估和执行动态代码?

因为我一直在浏览Douglas Crockford的JSON库。它在使用parse()时使用eval()但在实际评估之前进行预处理。如: -

  1. 代码中针对Unicode字符的墙。
  2. 代码显示恶意。
  3. 支持JSON.parse的现代浏览器本身是执行此操作还是遵循其他协议?

2 个答案:

答案 0 :(得分:9)

不,JSON.parse()不使用eval()

这是设计原因,因为eval()能够执行您提供的任意JavaScript代码,它可以执行您不希望它执行的操作。所以JSON.parse()执行它在锡上所说的内容:它实际上解析整个字符串并重建整个对象树。

JSON.parse通常被委托给用“本机”代码实现的内部函数,其中“native”表示在浏览器的javascript引擎的上下文中被认为是“本机”的(可能是编译的机器代码,可能是VM等字节码...)。我不认为对此有任何强烈要求。

实施方面的差异?

JSON(符号)本身由RFC4627编纂。

关于JSON对象及其方法的实现,所有现代浏览器的实现应该表现相同,因为它们应遵循ECMAScript 5JSON 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,那就类似于您的老板询问文档所说的内容,并且您选择执行所有内容该文件是为了向她解释。而不只是阅读它。