【发布时间】:2012-05-02 09:00:04
【问题描述】:
我在使用包含一些对象的 javascript 数组时遇到了一种奇怪的行为(也许这根本不奇怪,只是我不明白为什么)。
由于我不是 javascript 专业人士,因此很可能会清楚地解释为什么会发生这种情况,我只是不知道。
我有在文档中运行的 javascript。它创建了一个类似这样的对象数组:
var myArray = [{"Id":"guid1","Name":"name1"},{"Id":"guid2","Name":"name2"},...];
如果我像 JSON.stringify(myArray) 这样在创建它的地方打印出这个数组,我会得到我所期望的:
[{"Id":"guid1","Name":"name1"},{"Id":"guid2","Name":"name2"},...]
但是,如果我尝试从子文档访问此数组到此文档(由第一个文档打开的窗口中的文档),则该数组不再是数组。 所以在子文档中做 JSON.stringify(parent.opener.myArray) 会产生如下结果:
{"0":{"Id":"guid1","Name":"name1"},"1":{"Id":"guid2","Name":"name2"},...}
这不是我所期望的 - 我期望得到与我在父文档中所做的相同的结果。
谁能向我解释为什么会发生这种情况以及如何修复它以使该数组在从子窗口/文档寻址时仍然是一个数组?
PS。对象并没有像上面所说的那样添加到数组中,它们是这样添加的:
function objTemp()
{
this.Id = '';
this.Name = '';
};
var myArray = [];
var obj = new ObjTemp();
obj.Id = 'guid1';
obj.Name = 'name1';
myArray[myArray.length] = obj;
如果这有什么不同的话。
任何帮助都将不胜感激,既可以解决我的问题,也可以更好地了解正在发生的事情:)
【问题讨论】:
-
你在什么浏览器上测试?我记得有一个线程在 IE 中发生了完全相同的行为,但在 FF 中没有。你能提供一个 JSFiddle 来测试这个问题吗?见here。
-
我无法复制。你在哪个浏览器中测试过?你用过 JSON 库吗?
-
我在 IE 中进行测试,因为这是一项要求。就个人而言,我不会选择 IE,但这不取决于我。在此示例中,我仅使用 json 来对警报进行字符串化。我没有为产生该行为的代码使用任何 json 库。
-
如果我在创建数组的文档中执行 alert(typeof myArray.sort),我会得到“函数”。如果我在子文档中执行 alert(typeof parent.opener.myArray.sort) 我会得到“对象”,是的,这是 IE。看起来这与您链接的帖子中的情况完全相同。那么该怎么办呢?另一篇文章没有提供答案或解决方案。
-
不要使用 IE :-)
Object.prototype.toString.apply(value) === '[object Array]'的数组检测是否有效?然后,您可以使用使用此方法的 JSON 库。
标签: javascript arrays object