以下两个不同的代码片段似乎与我等效:
var myArray = Array(); myArray['A'] = "Athens"; myArray['B'] = "Berlin";
和
var myObject = {'A': 'Athens', 'B':'Berlin'};
因为它们的行为都相同,并且typeof(myArray) == typeof(myObjects)(两者都产生“对象”)。
typeof(myArray) == typeof(myObjects)
这些变体之间有什么区别吗?
查看更多
实际上,javascript中的所有内容都是对象,因此您可以通过在Array对象上设置任意属性来“滥用” Array对象。但是,这应该被认为是有害的。数组用于数字索引数据-对于非数字键,请使用对象。
下面是一个更具体的示例,为什么非数字键不“适合”数组:
var myArray = Array(); myArray['A'] = "Athens"; myArray['B'] = "Berlin"; alert(myArray.length);
这不会显示“ 2”,而是显示“ 0”-实际上,没有将任何元素添加到数组,仅将一些新属性添加到了数组对象。
myArray.length返回数组中最后一个元素的数字索引/键,但不返回元素的实际数量。Array对象的属性与数组值不同吗?
我只是想说明一下,如果您将Array对象当作常规对象对待,它的预期语义就会被滥用。链接的文章虽然做得更好:)
下次有人说JavaScript是一种很好的开发语言时,我将向他展示此示例。谢谢。
@Olivier,您所说的“ bug”也可以是一个很棒的“功能”。您可以添加完标题和描述阵列,而不影响其内容或长度,而无需将它们包装在使用对象
title
,description
和items
属性。这完全取决于您对语言的了解程度和使用方式。在数组上使用自定义属性并不是天生的错误。出问题的是,一旦他们期望它们充当阵列成员。它们是数组属性,而不是成员,因此不受数组方法的影响。这实际上是上述链接文章的作者在评论中说的。现在,公平地说,我不建议这样做,因为它可能会使使用您的代码的人感到困惑。或者,如果它们才刚刚开始,它将以身作则,将他们置于危险的道路上。但是我不会说JavaScript不好,因为JavaScript允许大多数您不希望的东西。