Javascript JSON.parse()是否在内部使用eval()?

Javascript JSON.parse()是否在内部使用eval()?,javascript,jquery,json,parsing,ecmascript-5,Javascript,Jquery,Json,Parsing,Ecmascript 5,在现代浏览器中,JSON.parse是否在内部使用eval()来计算和执行动态代码 因为我一直在浏览Douglas Crockford的JSON库。在使用parse()时,它还使用eval(),但在实际求值之前进行预处理。例如:- 针对代码中Unicode字符的墙 代码显示恶意意图 支持JSON.parse的现代浏览器是本机执行此操作还是遵循其他协议?否,JSON.parse()不使用eval() 这是经过设计的,因为eval()能够执行您提供给它的任意JavaScript代码,所以它可以执行您

在现代浏览器中,
JSON.parse
是否在内部使用
eval()
来计算和执行动态代码

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

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

    否,
    JSON.parse()
    不使用
    eval()
    这是经过设计的,因为
    eval()
    能够执行您提供给它的任意JavaScript代码,所以它可以执行您不希望它执行的事情。因此,
    JSON.parse()
    执行它在tin上所说的操作:它实际解析整个字符串并重建整个对象树

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

    实现上的差异? JSON(符号)本身由

    关于
    JSON
    对象及其方法的实现,所有实现的现代浏览器的行为都应该相同,因为它们应该遵循与的相同规范。然而,总有可能出现潜在的缺陷。例如,V8最初包含这个

    另外,请注意,上面注释中列出的实现是为您添加
    JSON.parse()
    支持,以支持本机不支持它的浏览器(也称为“您有时需要支持的这些该死的旧浏览器”)。但这并不意味着这一定是他们如何实现的


    例如,对于Chrome中使用的Google的V8实现,看看哪个调用了源代码。

    如果您仔细想想,这将是一件非常有趣的事情

    为了理解原因,看看这个类比是否有帮助:你和你的老板去了一个你会说这种语言但她不会的国家。因为你很流利,你将担任两个角色:她的助手(为她做任务)和翻译(告诉她事情的意思)

    所以你有这两份工作,它们是互补的。你的老板可以告诉你做些什么——用你们都懂的任何语言(比如英语)——也可以让你告诉她什么东西在说,比如一个手势或一份文件。她甚至可以同时做这两件事:给你一套用另一种语言写的说明,然后说:“这是我信任的人给我的,请按这里说的做。”

    在这个类比中,向老板阅读符号或文档就像是
    JSON.parse
    。你的老板给你指示,告诉你做他们说的每件事就像
    eval


    如果JavaScript引擎在内部为
    JSON.parse
    使用
    eval
    ,这就类似于你的老板问你一个文档说了什么,而你选择把文档中写的所有内容都表现出来,以便向她解释。不要只是读它。

    @dystroy我现在很感兴趣-来源在哪里?请检查这里的行号。471@sircapsalot事实上,Crockord有不止一个实现。这里是。浏览器没有理由在内部使用
    eval
    ,所以我确信他们不会使用它。移植或更改
    json_parse.js
    (我做到了)很容易。至少IE没有使用eval的一个证据是,在IE9上
    eval(“(“+json+”)”)
    会在大json字符串上崩溃浏览器,而
    json.parse
    不会崩溃:)