在javascript中在数组上添加属性是一种好习惯吗?

时间:2015-01-12 04:36:50

标签: javascript arrays

Array是JavaScript中的一个Object,所以我们可以/应该在其上存储自定义属性吗?

当我们使用数组时,大多数时候我们需要维护数组的当前指针/当前索引。我看到了两个实现:

实施1

var myArray = [2, 4 ,6, 8, 10],
var myArray_top = 0;

实施2

var myArray = [2, 4 ,6, 8, 10],
myArray.top = 0; // Notice I have added top as property of array

#2的优点

  1. 我不需要为每个数组维护多个变量。
  2. 代码看起来更具可读性
  3. #2

    的缺点
    1. 如果我将数组传递给方法,并且该方法可以操作内容并返回包含内容的新数组。在这种情况下,我可能会失去函数之外的“顶部”值。
    2. 两者中哪一个更好的方法?

4 个答案:

答案 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;

这使得迭代数组值变得容易,并且仍将其他属性关联为该对象的一部分。希望能够解释为什么这是一个更好的模式。祝你好运!

相关问题