为什么在Javascript中要使用类数组对象?

8

我知道因为javascript允许对象使用数字键,所以类似于数组的对象在技术上是可能存在的,但为什么它们变得如此普遍呢?

也许人们认为这些类似于数组的对象不仅仅具有数字键,例如arguments拥有callee属性,所以它们不能成为适合包含这些属性的正确的数组。

但在javascript中,将数组视为对象并使用非数字键是完全有效的:

var myArguments = []; 
myArguments[0] = 0; 
myArguments['callee'] = function(){console.log('callee')};

如果对象类似于数组,并且可以从数组原型继承的函数中受益,将其变成类似数组的对象有什么优势?
编辑:以防我的问题不清楚,类似数组的对象将是诸如arguments对象,其具有从零开始的连续数字属性,并且具有一个长度属性,该属性比最高数字键小1。它也不继承自数组原型,并且不提供访问数组方法的功能。

2
类似数组 - 你有一个数组,没有什么“类似”的 - 而且像JavaScript中的任何东西一样,数组继承自对象,因此非数字的“属性键”是可能的。 - Jaromanda X
1
以前不一定能从(子类)Array继承,因此如果您想使用构造函数创建这样的对象(实例都链接到同一原型),则不能使用实际的Array。但是,您仍然可以使用.call().apply()在类似数组的对象上使用(某些)数组方法,因此... - nnnnnn
1
@nnnnnn,这确实很有道理,特别是对于像HTMLCollection这样的东西,但对于直接从Object原型继承的arguments仍然有点困惑。 - martin
“为什么它们变得如此普遍?” - 我认为它们从未变得普遍。 - Bergi
4个回答

2

我认为使用类数组对象的最大优势是对象本身。与数组相比,对象的开销更小。 可以阅读:JavaScript中数组与对象的效率对比

另一个优点是,语言不必像数组一样创建/分配连续的内存。对象的性质更加动态。数组必须提前创建内存块,并在超载时更新。

了解更多:JavaScript数组如何进行内部调整大小?

我认为另一个因素是,在映射或对象中查找速度更快。


“数组不需要提前创建内存块。” - 不需要。引擎可以像对象一样进行优化处理。 - Bergi

0

没有太大的优势,因为您可以以非常相似的方式访问对象和数组,对于数组使用array[number],对于对象使用object.propertyobject["property"]。在我看来,数组更适合存储数据而不是函数,而对象更适合存储一组函数。例如,数组可以在记忆游戏中存储您的答案,但对象将存储游戏的命令,如开始或结束。


-1

编辑:正如@Bergi所述,我忘记给对象添加length属性。另外,我意识到我的答案与问题无关。因此,在进行简短的研究后,我对它进行了更新。

在Typescript中,类似数组的对象定义如下:

interface ArrayLike<T> {
  length: number;
  [n: number]: T;
}

有两个主要的类似数组的对象: argumentsHTMLCollection。使用类似数组的对象的原因是将数组仅用作数据容器而没有任何行为。正如您可能意识到的那样,如果您尝试在 arguments 对象上使用 forEach,您将会得到一个类型错误,因为它未定义。如果您坚信您创建的数组仅用作不带任何方法的数据容器,则可以使用类似数组的对象。然而,需要注意的是,它们在 ES6 之后变得越来越少。


2
类似数组的对象至少具有一个.length属性。 - Bergi

-3

实际上,JS中的数组是一个对象 :)

只要你需要数组,创建类似数组的对象是一个不好的想法,因为JS引擎会优化数组的速度。但这是可能的。


2
但问题在于为什么创建类似数组的对象而不是实际的数组相对来说很常见,而不是它是否是一个好主意。 - nnnnnn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接