Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-数组和类似数组的对象之间的区别_Javascript_Arrays - Fatal编程技术网

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

JavaScript-数组和类似数组的对象之间的区别,javascript,arrays,Javascript,Arrays,我在JavaScript中经常遇到“类似数组的对象”这个术语。这是怎么一回事?它和普通数组有什么区别?类似数组的对象和普通对象有什么区别 这是什么 具有非负整数长度属性的对象,通常具有一些索引属性。比如说 var ao1 = {length: 0}, // like [] ao2 = {0: 'foo', 5: 'bar', length: 6}; // like ["foo", undefined × 4, "bar"] 您可以使用Array.

我在JavaScript中经常遇到“类似数组的对象”这个术语。这是怎么一回事?它和普通数组有什么区别?类似数组的对象和普通对象有什么区别

这是什么

具有非负整数长度属性的对象,通常具有一些索引属性。比如说

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); // []
它和普通数组有什么区别

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

ao1 instanceof Array; // false
ao1[0] = 'foo';
ao1.length; // 0, did not update automatically
类似数组的对象和普通对象有什么区别

没有区别。甚至普通数组也是JavaScript中的对象


我认为,在ES6中,如果它是可写的(有一个
[Symbol.iterator]
属性),那么它就是数组。

著名的
HTMLCollection
()和
参数
()都是自动创建的类似数组的对象

一些快速数组(例如
HTMLCollection
)与实际数组示例之间的差异:

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

相似性:

长度getter是相同的:

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')
索引的getter是相同的:

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')
它们都是
对象

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"
类数组不是真正的数组:

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;

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

一个是数组,另一个是对象。一个有数组方法,另一个可能有,也可能没有。类数组对象是一个对象,您可以使用常规
for
循环和数字索引对其进行迭代。类似数组的对象是从许多本机DOM方法(如
GetElementsByCassName()
)返回的。这就像狗和类似狗的动物之间的区别,但如果你不知道“like”是什么意思,这是一个无用的解释。我认为这不是一个坏问题。例如,“Array-like”也可能意味着对象公开了一个
forEach
方法(这并不意味着)。澄清对象数组的哪些特征是好的:)为什么这个问题被否决了?
,所以(通常)不会从数组继承。prototype
想详细说明“通常”部分吗?如果它继承自
array.prototype
?@Taurus如果您以ES5方式为某个自定义对象设置原型,您将获得数组like
array.isArray(object.create(array.prototype));//错误
。如果您使用ES6+
CLASSA2扩展数组
super
,您将获得数组
Array.isArray(新A2);//是的
@Paul_S。我认为这更像是对
isArray
方法的一种误解,因为它在幕后使用了内部的
[[class]]
属性,而不是证明具有
Array.prototype
的对象类似于数组,而是具有可用数组方法的对象(通过继承<代码>数组。原型,这也意味着它有一个<代码>长度>代码>属性,它不是一个数组,它是一个数组。@ Tururs在ES5-版本中,即使你做了一些类似于<代码>函数英尺()的{};Foo.Tyrase= Objist.Cube(数组。原型);f =新Foo;< /Cord>考虑如何<代码> F[ 0 ]。=1;f.length;//=>0。这意味着它不是一个真正的数组,因为设置索引不会对长度产生预期的副作用。对ES6+执行相同操作会对长度产生副作用length@techie_28添加一个长度,它将进行排序,没有长度,你的对象就不是一个类似数组的对象,“类似数组的对象”是一个存在的事物的实际标题s定义的属性,这些属性可以具体应用于以特定方式构建和使用的对象。您认为或您知道吗?根据本文中的一条语句,您可能是对的->此外,您可以将Array.from()与实现iterable协议的任何对象或基元一起使用