【发布时间】:2011-07-10 10:25:33
【问题描述】:
例如我有以下代码:
localStorage["screenshots"] = new Array();
localStorage["screenshots"]["a"] = 9;
alert(localStorage["screenshots"]["a"]);
Arr = new Array();
Arr["screenshots"] = new Array();
Arr["screenshots"]["a"] = 9;
alert(Arr["screenshots"]["a"]);
(我在 Windows Vista 32 位上使用 Google Chrome v9.0.597.107)
但只有第二部分有效(alert() 的输出是“a”)! 第一个警报输出对比“未定义”!
有什么问题?
谢谢。
【问题讨论】:
-
与本地存储问题无关,但是JS没有关联数组这个概念。当您创建一个数组并通过 ["name"] 语法添加项目时,您实际上是在向该 Array 实例对象添加一个属性。数组的长度属性不会改变,数组也不会被认为有任何项目。如果你不是在索引数组之后,你应该做的是创建一个对象(唯一的 Array JS 知道任何事情)。
-
@JAAulde:这是一个极度的误导性陈述。 JavaScript 有对象,使用
new Object()或对象文字语法{}创建,它们是 associative arrays。 -
@Matt 不,它们是对象。您链接的网站混合了术语,是误导发生的地方。您可以按照其他语言处理关联数组(方括号中的字符串命名属性访问)的方式处理它们,但它们不是数组。它们没有通过操作维护的长度属性,也没有与数组相关的方法,例如 push、shift 等。JS 只有一个对象属于数组类别,即用 Array( )。它是一个索引数组,而不是关联数组。
-
@JAAulde:您使用的是什么定义的关联数组?我没有看到任何东西,比如Wikipedia,说关联数组必须有
length属性或(整数索引)数组方法。据我了解,基本方法是(维基百科似乎同意我的观点):add、reassign、remove和lookup。另见this article。 -
@Matt,诚然,这里存在一些语义问题。用计算机科学术语来说,JS 在用于其对象的哈希表机制中实现关联数组是对的。不过,我说的是 JS 细节。尽管在底层使用了 assoc 数组,但 JS 并没有通过这样的名称为开发人员提供这样的构造。 JS 提供了 Objects,它的子类是一个数组( Array() )。在 JS 中,当您使用 Array 时,这是因为您需要我前面提到的行为。我的第一条评论源于我认为对该结构的滥用
标签: javascript arrays html google-chrome associative-array