Array是JavaScript中的一个Object,所以我们可以/应该在其上存储自定义属性吗?
当我们使用数组时,大多数时候我们需要维护数组的当前指针/当前索引。我看到了两个实现:
var myArray = [2, 4 ,6, 8, 10],
var myArray_top = 0;
var myArray = [2, 4 ,6, 8, 10],
myArray.top = 0; // Notice I have added top as property of array
#2的优点
#2
的缺点两者中哪一个更好的方法?
答案 0 :(得分:8)
逆势观点。如果你有与数组本质连接的值,并且你想要轻松地携带它们,我认为将它们作为属性放在数组上是完全可以接受的,并且在许多情况下是可取的。
有些事情要注意,其中一些你已经拥有:
如果您正在使用for...in
循环遍历数组的元素,那么您将获取添加的属性,但无论如何您还没有这样做,对吗?
您指出slice
等例程将返回没有添加属性的新数组的问题是正确的。但是,看起来像切片这样的东西可能也需要更改属性。因此,您可以编写自己的切片来保留/修改添加的属性。或者,您可以使用自变异数组函数,例如splice
。
JSON.stringify
将忽略您添加的媒体资源。
您可以将添加的属性视为一种元数据。将元数据直接存储在对象上是很自然的,它始终存在于对象中。无论你走到哪里都必须围绕一个并行的元数据对象,或者必须将数组包装在一个对象中以保留元数据,这似乎很奇怪。
无论是好还是坏,JS的设计者都将数组实现为具有对象的所有功能和机制的对象,包括保存任意属性。当然,数组主要设计为数组,具有自己的方法和自动length
处理。但是,当有意义的时候,没有理由弃用它们作为具有附加属性的对象的能力。
FWIW,Douglas Crockford在“JavaScript:The Good Parts”(第62页)中给出了一个向数组添加属性的示例,尽管在他的情况下它是函数值。
当然,您应该确保您的设计确实需要携带这些附加属性。担心和管理是另一回事。如果它们是可计算的,则建议在需要时计算它们而不是存储它们。如果您使用它们作为传递其他信息的hacky方式,您可能需要重新访问您的设计。
说了这么多,有一种思想认为数组应该是数组。例如,Google coding guidelines说
不允许使用关联数组...或者更准确地说,不允许对数组使用非数字索引。如果你需要map / hash在这些情况下使用Object而不是Array,因为你想要的功能实际上是Object的功能而不是Array的功能。数组恰好扩展了Object。
所以在一天结束时,正如其他人在这里正确指出的那样,它归结为风格和偏好。
答案 1 :(得分:5)
考虑两者结合:
var myObj = {};
myObj.myArray = [2, 4 ,6, 8, 10];
myObj.top = 0;
当然,如果你试图让每个人都开心,你就不会让任何人满意。
答案 2 :(得分:1)
虽然这主要是基于意见的,但您或多或少会自己回答您的问题。
问题不在于您拥有多少变量,而在于存储它们的位置。因此#2的第一个职业选手没有实际意义。这让我们得到了双方的论点:a)使代码可读(这也是一个偏好的问题),或b)使代码函数可预测。
从这一点来看,你应该选择可预测性。使用第一个或将两者合并在一个对象中。
答案 3 :(得分:0)
在javascript编程中,原始类型是诸如String,Boolean和数字类型之类的东西。对象是存储为键/值对的“哈希映射”,而数组是索引存储的任何类型的列表。您的第二个实现通过将数组视为对象来混淆数组之间的对象。更好的实现是将数组存储为该对象的属性。该代码如下:
var myObject = {};
myObject.arrayValue = [2, 4, 6, 8, 10];
myObject.top = 0;
这使得迭代数组值变得容易,并且仍将其他属性关联为该对象的一部分。希望能够解释为什么这是一个更好的模式。祝你好运!