TL; DR:向Array.prototype和Function.prototype添加任何非内置函数将导致IE8本机JSON解析器在解析包含数组的任何JSON时获得堆栈溢出,但仅当您还传递了reviver函数时进入JSON.parse().
这开始是一个问题,但我回答了我自己的原始问题,所以现在我会问:任何人都可以想到这个IE8错误的解决办法,不涉及删除修改Array.prototype和Function的所有JS库.原型?
原始问题:
我有大约13k的JSON数据要解析.数据的结构是具有单个值的对象,该值是嵌套数组.
{ 'value':[[ stuff ], [ more stuff], [ etc ]] }
Run Code Online (Sandbox Code Playgroud)
我正在使用json2.js,它在可用时遵循浏览器本机JSON.parse.我正在将一个reviver函数传递给JSON.parse来正确处理日期.当IE8处于IE7仿真模式(导致它使用基于脚本的json2.js解析器)时,一切正常.当IE8处于IE8模式(导致它使用浏览器本机JSON解析器)时,它会出现"堆栈空间不足"错误.当然,Firefox和Chrome可以与浏览器原生的JSON解析器一起使用.
我把它缩小到这个:如果我将一个do-nothing reviver函数传递给JSON.parse,那么IE8本机解析器会获得堆栈溢出.如果我传入没有reviver函数,IE8本机解析器工作正常,除了它不能正确解析日期.
// no error:
JSON.parse(stuff);
// "out of stack space" error:
JSON.parse(stuff, function(key, val) { return val; });
Run Code Online (Sandbox Code Playgroud)
我将使用我的JSON数据,看看数据的更少或更少的嵌套可以避免错误,但我想知道是否有人之前已经看过这个,或者有任何其他建议的解决方法.IE8已经足够慢了,因为这个bug而禁用该浏览器的原生JSON将是一种耻辱.
更新:在其他情况下,使用不同的JSON数据,当我使用具有reviver功能的IE8本机解析器时,我收到javascript错误"$ lineinfo is undefined",如果我不使用reviver函数则没有错误.字符串"$ lineinfo"不会出现在我的任何源代码中的任何位置.
更新2:实际上,这个问题似乎是由Prototype 1.6.0.3引起的.在我添加到Prototype库之前,我无法在隔离的测试页面中重现它.
更新3:
prototype.js打破IE8原生JSON解析器的原因是:向Array.prototype和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": …Run Code Online (Sandbox Code Playgroud)