当前位置: 首页 > 面试题库 >

IE8本机JSON.parse错误导致堆栈溢出

顾超
2023-03-14
问题内容

TL; DR: 将任何非内置函数添加到Array.prototype AND
Function.prototype将导致IE8本机JSON解析器在解析包含数组的任何JSON时发生堆栈溢出,但仅当您还传递了reviver函数时放入JSON.parse()。

最初这是一个问题,但我回答了我自己的原始问题,所以现在我要问:有人能想到此IE8错误的解决方法,该方法不涉及消除所有修改Array.prototype和Function的JS库。
。原型?

原始问题:

我有大约13k的JSON数据要解析。数据的结构是一个具有单个值的对象,该值是一个嵌套数组。

{ 'value':[[ stuff ], [ more stuff], [ etc ]] }

我正在使用json2.js,它在可用时会遵循浏览器的本地JSON.parse。我将reviver函数传递给JSON.parse以正确处理日期。当IE8处于IE7仿真模式(导致它使用基于脚本的json2.js解析器)时,一切正常。当IE8处于IE8模式(导致它使用浏览器本地JSON解析器)时,它会爆炸并显示“堆栈空间不足”错误。Firefox和Chrome当然可以与它们的浏览器本地JSON解析器配合使用。

我将其范围缩小到:如果我什至不做任何事情都将reviver函数传递给JSON.parse,则IE8本机解析器将导致堆栈溢出。如果我没有传递任何回复函数,则IE8本机解析器可以正常工作,除非它无法正确解析日期。

// no error:
JSON.parse(stuff);

// "out of stack space" error:
JSON.parse(stuff, function(key, val) { return val; });

我将使用JSON数据,以查看较少的数据或较少的数据嵌套可以避免该错误,但是我想知道是否有人以前见过此方法,或是否有其他建议的解决方法。IE8已经足够慢了,由于这个错误,禁用该浏览器的本机JSON将很可惜。

更新:在其他情况下,使用不同的JSON数据,当我将IE8本机解析器与齐磊函数一起使用时,出现了JavaScript错误“ $
lineinfo未定义”,如果不使用齐磊函数,也没有错误。字符串“ $ lineinfo”在我的任何源代码中都没有出现。

更新2:实际上,此问题似乎是由原型1.6.0.3引起的。在添加到原型库之前,我无法在单独的测试页中复制它。

更新3:

prototype.js破坏IE8本机JSON解析器的原因是:将任何非内置函数添加到Array.prototype AND
Function.prototype将导致IE8本机JSON解析器在解析包含数组的JSON时出现堆栈溢出,但前提是您还需要将reviver函数传递给JSON.parse()。

Prototype库将函数添加到Array.prototype和Function.prototype,但这同样适用于任何其他执行相同操作的库。IE
JSON解析器中的此错误由Prototype和Ext公开,但不由jQuery公开。我还没有测试任何其他框架。

这是问题的完全独立再现。如果删除Function.prototype行或Array.prototype行,或从JSON字符串中删除数组,则不会出现“堆栈空间不足”错误。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
<script type="text/javascript">

Function.prototype.test1 = function() { };
Array.prototype.test2 = function() { };

window.onload = function()
{
    alert(JSON.parse('{ "foo": [1,2,3] }', function(k,v) { return v; }));
}

</script>
</head>
<body>

</body>
</html>

问题答案:

这只是修补。
http://support.microsoft.com/kb/976662

http://msdn.microsoft.com/zh-
CN/library/cc836466(VS.85).aspx



 类似资料:
  • 我有一个名为User的实体,它有一组角色。我还有一个角色实体,它有一组用户。(这只是出于学习目的的实践应用。) 问题是——我有一个UserController(REST API)来发送用户列表——这会导致StackOverFlow错误。用户试图加载角色,而角色又试图加载用户等。 我的问题是——如何避免这种情况?我也看到许多类似的设计。例如:https://viralpatel.net/blogs/

  • 问题内容: 这有效:http : //play.golang.org/p/-Kv3xAguDR。 这导致堆栈溢出:http : //play.golang.org/p/1-AsHFj51O。 我不明白为什么。在这种情况下,使用接口的正确方法是什么? 问题答案: 这个 将呼叫您的,依次呼叫,等等。如果您需要解组JSON然后对其进行处理,那么一种巧妙的技术是声明一个本地类型,将数据解组到其中,然后转换

  • 问题内容: 我到处都是,找不到可靠的答案。根据文档,在以下情况下,Java引发java.lang.StackOverflowError错误: 由于应用程序递归过深而在堆栈溢出时抛出。 但这提出了两个问题: 不仅通过递归,还有其他方法可以使堆栈溢出吗? 是在JVM实际溢出堆栈之前还是之后发生StackOverflowError? 详细阐述第二个问题: 当Java引发StackOverflowErro

  • 问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。

  • 我正在使用一个正则表达式从任意长的输入字符串中提取键值对,并且遇到了这样的情况:对于具有重复模式的长字符串,它会导致堆栈溢出。 KV解析代码如下所示: 一些虚构的输出示例: 我显式地将generic放在上面,而不是在解析之前检查最大字符串长度的hacks(例如)。 我能想出的最粗俗的解决方法,一个真正的反模式,是 有趣的是,它在我试过的几次运行中都起作用了,但它不是一个值得推荐的有品位的东西。:-

  • 问题内容: 因此,我有主类在运行时调用。在Secondary类中,在顶部的代码是。 如何在不引起堆栈溢出错误的情况下使用次要类中的所有方法和变量,反之亦然? 注意:它们不在构造函数中 问题答案: 您的Main类正在创建一个Secondary实例,在创建一个Main实例…,这会导致堆栈溢出错误。 我认为您只是希望对象之间能够相互引用,所以不要在构造函数中创建另一个类的新实例。将引用声明为实例变量,并