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

标签 javascript arrays

<分区>

数组是 JavaScript 中的对象,所以我们可以/应该在其上存储自定义属性吗?

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

实现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. 代码看起来更具可读性

#2 的缺点

  1. 如果我将数组传递给一个方法,该方法可能会操纵内容并返回一个包含内容的新数组。在那种情况下,我可能会在函数外丢失“top”的值。

这两种方法中哪一种更好?

最佳答案

逆势观点。如果您有与数组有内在联系的值,并且您希望轻松携带它们,我认为将它们作为属性放在数组中是完全可以接受的,并且在许多情况下是可取的。

一些需要注意的事项,其中一些您已经有:

  • 如果您使用 for...in 循环遍历数组的元素,您将获取添加的属性,但无论如何您都没有这样做,对吧?

  • 您正确地指出了诸如 slice 之类的例程将返回没有添加的属性的新数组的问题。然而,看起来像切片这样的事情可能也需要改变属性。因此,您可以编写自己的切片来保留/修改添加的属性。或者,您可以使用自变异数组函数,例如 splice

  • JSON.stringify 将忽略您添加的属性。

您可以将添加的属性视为一种元数据。将元数据直接存储在对象上是很自然的,它总是在那里。无论走到哪里都必须随身携带一个并行元数据对象,或者必须将数组包装在一个对象中只是为了与它一起保存元数据,这似乎很奇怪。

JS 的设计者,无论好坏,都将数组实现为具有对象的所有功能和机制的对象,包括持有任意属性。当然数组主要是设计成数组,有自己的方法和自动的length处理。但这没有理由贬低它们在有意义的情况下也可以成为具有附加属性的对象的能力。

FWIW,Douglas Crockford 在“JavaScript:The Good Parts”(第 62 页)中给出了一个向数组添加属性的示例,尽管在他的例子中它是函数值。

当然,您应该确保您的设计确实需要携带这些附加属性。这是另一件需要担心和管理的事情。如果它们是可计算的,建议在需要时计算它们而不是存储它们。如果您将它们用作传递附加信息的一种骇人听闻的方式,您可能需要重新审视您的设计。

说了这么多,有一种观点认为数组就应该是数组。例如,Google coding guidelines

Associative Arrays are not allowed... or more precisely you are not allowed to use non number indexes for arrays. If you need a map/hash use Object instead of Array in these cases because the features that you want are actually features of Object and not of Array. Array just happens to extend Object.

所以归根结底,正如其他人在这里正确指出的那样,它归结为风格和偏好。

关于javascript - 在 javascript 中向数组添加属性是一种好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27895365/

相关文章:

javascript - 跨域页面刷新

arrays - smartmatch 运算符未按预期工作

Python:如何将数组中的值从某个位置移动到另一个位置?

javascript - 如何提取嵌套对象数组的值?

javascript - 在数组范围内查找索引

javascript - Onclick 调用函数不适用于我的一个 Div

javascript - 不引人注目的验证甚至在我的 javascript 调用提交之前就失败了

c - 声明数组的更好方法?

php - 使用 codeigniter 将 row_array 添加到 result_array foreach 循环?

javascript - 使用下划线/lodash 电子邮件列表/集合随机播放和配对