Javascript IE[89]为什么要将数组转换为具有数字/字符串键的对象?

Javascript IE[89]为什么要将数组转换为具有数字/字符串键的对象?,javascript,internet-explorer-8,internet-explorer-9,extjs4.2,Javascript,Internet Explorer 8,Internet Explorer 9,Extjs4.2,我有以下JavaScript变量,它由服务器注入到网页中 <script type="text/javascript"> var jsonData = [{"display_mode":...}]; </script> 请注意,数组在离开浏览器后现在是一个具有字符串键的对象,但在浏览器中是一个具有整数键的对象,在源中发送时是一个真实的数组 它应该是这样的: '[{"display_mode":"TREE",.... 我正在做什么来触发此浏览器中的此行为?有没有办法不触

我有以下JavaScript变量,它由服务器注入到网页中

<script type="text/javascript">
var jsonData = [{"display_mode":...}];
</script>
请注意,数组在离开浏览器后现在是一个具有字符串键的对象,但在浏览器中是一个具有整数键的对象,在源中发送时是一个真实的数组

它应该是这样的:

'[{"display_mode":"TREE",....
我正在做什么来触发此浏览器中的此行为?有没有办法不触发这种行为

我使用extjs4.2.2来序列化JSON,就像在IE10、11、Chrome和FF上一样。只有在这些版本的IE上,它才会将数组更改为用于序列化的键控对象


现在我正在开发一个解决方案,在这个解决方案中,我将迭代伪数组,并根据extjs框架检测到的版本构建一个新的有效数组发送回web服务器。我不喜欢添加这样的代码,因为版本检测很脆弱。我希望这种情况从一开始就不会发生。

当您查看IE8中的原始jsonData变量时,它显示如下:

'{"0":{"display_mode":"TREE",...
幸运的是,这也将检测为不包含Ext.isArray的数组。因此,了解数据结构后,我可以执行以下操作:

var fixed, items, t, i, transaction;

// This fix is here for ie8 and ie9 to turn the arrays back into arrays
if(!Ext.isArray(jsonData)) {
    fixed = [];
    for(t=0; t < jsonData.length; ++t) {
        transaction = jsonData[t];
        items = [];
        for(i=0; i < transaction.items.length; ++i) {
            items.push(transaction.items[i]);
        }
        transaction.items = items;
        fixed.push(transaction);
    }
    jsonData = fixed;
}
完成此操作后,调试将其显示为:

请注意,在我更正之后,对象有一个名为[Methods]的东西。这使得它可以正确地序列化为JSON数组。我怀疑正在发生什么,但我不能完全证明,由于IE糟糕的工具集,他们在解析脚本标记时从数组到对象进行转换。这不会在浏览器中引起任何操作问题,因为这些数组/对象支持长度,这允许循环迭代,Ext.each工作,它们在内部的行为类似于数组。但是序列化程序会识别出差异,并以错误的方式将它们发送回

另一个数据点来自javascript控制台


jsonData看起来像一个对象,但行为却像一个数组,因为我可以在更正数组之前获取jsonData.length的有效值。如果我创建一个真实的对象x,并试图得到它的长度,我会得到我期望的未定义的。所以我要把这一个归于另一个IE缺陷。如果其他人遇到这个问题,至少解决起来会更容易。

所有键,无论是数组还是对象,实际上都是JS中的字符串。您似乎遇到了序列化问题。那么,如何序列化数据呢?你总是含糊不清地引用数据对象,数组,真的,假的。。。我不知道你在哪里有什么。我不认为任何版本的IE都能做到这一点。还有什么你没有提到的信息吗?顺便说一句,任何属性名称都会在内部转换为字符串,甚至是数组属性。typeof[]==对象,我猜调试器所做的只是类型检查。在IE8和IE9中,此数组的处理方式不同,除了调试器输出之外?你是如何将jsonData转换成JSON的?让我了解这一线索的线索来自于使用ExtJS时,你可以使用它将各种东西转换成数组。