JavaScript-数组和类似数组的对象之间的区别
我在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.
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方式为某个自定义对象设置原型,您将获得数组likearray.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协议的任何对象或基元一起使用