JavaScript - Array和类似Array的对象之间的区别

时间:2015-04-17 19:10:51

标签: javascript arrays

我遇到过这个术语" Array-Like Object"很多用JavaScript。它是什么?它和普通数组之间的区别是什么?类数组对象和普通对象之间的区别是什么?

4 个答案:

答案 0 :(得分:26)

  

这是什么?

Object ,其长度属性为非负整数,通常还有一些索引属性。例如

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

您可以使用Array.prototype.slice

类似数组的对象转换为 Array 对应物
var arr = Array.prototype.slice.call(ao1); // []
  

它和正常数组之间的区别是什么?

它不是由Array数组文字 []构建的,因此(通常)不会从​​Array.prototype继承。 length 属性通常也不会自动更新。

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

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

没有区别。即使是正常的 Arrays 也是 JavaScript 中的对象

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

答案 1 :(得分:3)

著名的HTMLCollectiondocumentation)和argumentsdocumentation)是自动创建的类似数组的对象。

实际数组示例之间的一些类似数组的快速变化(例如HTMLCollection):

var realArray = ['value1', 'value2'];
var arrayLike = document.forms; 

相似之处

长度获取器是相同的:

arrayLike.length; // returns 2;
realArray.length; // returns 2; //there are 2 forms in the DOM.

索引的吸气剂是相同的:

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

它们都是objects

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

差异:

在类似join()concat()includes()等的数组中,方法不是函数:

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

like数组实际上不是数组:

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

在无法设置length属性的数组中:

arrayLike.length = 1;
arrayLike.length; //return 2; //there are 2 forms in the DOM.
realArray.length = 1;
realArray.length; //return 1;

答案 2 :(得分:0)

还有性能差异。在video中,Mathias Bynens建议对类似数组的对象使用数组,因为V8已针对常见数组进行了优化。

答案 3 :(得分:-1)

我认为,在ES6中,如果它是可迭代的(具有[Symbol.iterator]属性),则类似于Array。