问题 javascript - Array和类似Array的对象之间的区别


我在javascript中经常遇到“Array-Like Object”这个术语。它是什么 ?它和普通阵列有什么区别?什么是类似数组的对象和普通对象之间的区别?


1968
2018-04-17 19:10


起源

请参考? - Daniel A. White
一个是数组,另一个是对象。一个有阵列方法,另一个可能有也可能没有。 - Kevin B
类似数组的对象是一个对象,您可以使用常规迭代 for 循环和数字索引。类似于数组的对象是从许多本机DOM方法返回的 getElementsByClassName()。 - Teemu
这就像狗和狗一样的动物之间的区别,但如果你不知道“喜欢”是什么意思,这是一个无用的解释。 - PSkocik
我认为这不是一个糟糕的问题。 “类似数组”也可能暗示对象暴露了一个 forEach 例如,方法(并不意味着)。澄清哪些特性使对象阵列像是好:) - Felix Kling


答案:


它是什么?

一个 目的 有一个 长度 非负面的财产 整数,通常是一些索引属性。例如

var ao1 = {length: 0},                     // like []
    ao2 = {0: 'foo', 5: 'bar', length: 6}; // like ["foo", undefined × 4, "bar"]

你可以转换 类似数组的对象 他们的 排列 同行使用 Array.prototype.slice

var arr = Array.prototype.slice.call(ao1); // []

它和普通阵列有什么区别?

它不是由...构建的 Array 或者用 数组文字  [],所以(通常)不会继承 Array.prototype。该 长度 属性通常也不会自动更新。

ao1 instanceof Array; // false
ao1[0] = 'foo';
ao1.length; // 0, did not update automatically

什么是类似数组的对象和普通对象之间的区别?

没有区别。甚至正常 数组 是 对象 在 JavaScript的

ao1 instanceof Object; // true
[] instanceof Object; // true

15
2018-04-17 19:18



and so (usually) won't inherit from Array.prototype 注意详细说明“通常”部分?不是像数组一样的东西,而是一个继承自的数组 Array.prototype ? - doubleOrt
@Taurus如果您以ES5方式为某些自定义对象设置原型,您将获得类似Array的 Array.isArray(Object.create(Array.prototype)); // false。如果您使用ES6 + class A2 extends Array 和 super,你会得到阵列 Array.isArray(new A2); // true - Paul S.
@Paul_S。我认为这更像是一个问题 isArray 方法,因为它使用内部 [[class]] 幕后的财产,而不是一个对象的证明 Array.prototype 是一个类似数组的对象,它具有可用的数组方法(通过继承自 Array.prototype,这也意味着它有一个 length 并且是数字索引不是数组,它是一个数组。 - doubleOrt
因此,ES6的扩展会影响内部 [[class]] 财产?或者这里有一个完全不同的机制吗? - doubleOrt
@ techie_28加一个 长度 它会排序,没有 长度 你的对象不是 阵列状 - Paul S.


有名的 HTMLCollection 和 arguments 是自动创建的类似数组的对象。

一些类似快速的阵列(例如 HTMLCollection)实数组示例之间的差异:

var realArray = ['value1', 'value2'];
var arrayLike = document.forms; //there are 2 forms in the DOM.

arrayLike.length; // returns 2;
realArray.length; // returns 2;

arrayLike[0]; // returns an element.
realArray[0]; // returns an element. ('value')

arrayLike.join(", "); // returns Uncaught TypeError: arrayLike.join is not a function (also relevant to `concat()`, `includes()` etc.)
realArray.join(", "); // returns "value1, value2"

typeof arrayLike; // returns "object"
typeof realArray; // returns "object"

Array.isArray(arrayLike); //returns "false"
Array.isArray(realArray); //returns "true"

arrayLike.length = 1;
arrayLike.length; //return 2;
realArray.length = 1;
realArray.length; //return 1;

0
2017-07-10 20:44





我认为,在ES6中,如果它是可迭代的,那么它就像Array一样(有一个 [Symbol.iterator] 属性)。


-1
2018-02-04 10:25



“类似数组的对象”是存在的事物的实际标题。它定义了可以具体应用于以某些方式构建和使用的对象的属性。 - monsto