在Javascript数组上存储属性有什么缺点吗?

在Javascript数组上存储属性有什么缺点吗?,javascript,Javascript,我知道Javascript数组实际上是对象,因为它们是对象,所以它们可以有属性。下面是一个例子: var a = [1, 2, 3]; a.currentIndex = 2; a.next = function() { ... }; a.prev = function() { ... }; a.length // returns 3 对我来说,这似乎很方便。我看到了许多原因,为什么您可能希望将状态或实用程序函数存储在实际数组本身上,而不是存储在其他变量上。它甚至比将数组作为对象的属性以及存储

我知道Javascript数组实际上是对象,因为它们是对象,所以它们可以有属性。下面是一个例子:

var a = [1, 2, 3];
a.currentIndex = 2;
a.next = function() { ... };
a.prev = function() { ... };

a.length // returns 3
对我来说,这似乎很方便。我看到了许多原因,为什么您可能希望将状态或实用程序函数存储在实际数组本身上,而不是存储在其他变量上。它甚至比将数组作为对象的属性以及存储在该对象上的其他内容更好

我的问题是:

有人知道在Javascript数组中存储属性有什么问题吗?它在所有浏览器中都能工作吗?有没有证据表明这会随着未来版本的Javascript而改变?关于这是否是一个好的实践,有没有普遍的看法


(顺便说一句,我不需要用For…in循环来迭代数组。我知道这样的循环也会包括属性)

既然您已经排除了For in问题,我这里的回答是明确的“否”-没有问题需要担心。所有
Array.prototype
方法将仅应用于“索引”键(0…n)

这里最好的例子是众所周知的jQuery库,它也使用类似数组的对象来存储DOM节点,但它也有许多附加到该对象的方法(jQuery使用原型)。然而,像Zepto这样的其他库只是将这些方法直接放在“array”对象本身上


所以再次强调,不,没有其他的警告,你可以省去做。

既然你已经排除了
的问题,我的回答是明确的“不”-没有问题需要担心。所有
Array.prototype
方法将仅应用于“索引”键(0…n)

这里最好的例子是众所周知的jQuery库,它也使用类似数组的对象来存储DOM节点,但它也有许多附加到该对象的方法(jQuery使用原型)。然而,像Zepto这样的其他库只是将这些方法直接放在“array”对象本身上


同样,没有其他警告,您可以省去这一步。

是的,它适用于所有浏览器。它是有效的javascript(数组是对象)。您可能会想到许多原因,为什么要使用数组构造函数而不是对象,但是如果这是您首选的编码样式,那么就使用它。

是的,它适用于所有浏览器。它是有效的javascript(数组是对象)。你可能会想到很多原因,为什么你想使用数组构造函数而不是对象,但是如果这是你喜欢的编码风格,那就去吧。

还有一件事——如果这很重要的话,“复制”数组原型函数都不会复制你的任何额外属性,即
.splice
.slice
concat
将为您提供新的“干净”阵列,而无需
currentIndex
,等等

只需扔掉一件事——如果这很重要,任何“复制”阵列原型函数都不会复制您的任何额外属性,即
.splice
.slice
concat
将为您提供新的“干净”数组,而不使用
currentIndex