Array.prototype

Array.prototype

Array.prototype  属性表示Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法。

// If JavaScript doesn't provide a first() method natively, // add a new method returning the first element of an array. if (!Array.prototype.first) { Array.prototype.first = function() { return this[0]; } }

描述

Array实例继承自Array.prototype 。与所有构造函数一样,您可以更改构造函数的原型对象,以对所有Array 实例进行更改。例如,可以添加新方法和属性以扩展所有Array对象。这用于 polyfilling, 例如。

鲜为人知的事实:Array.prototype本身也是一个 Array

Array.isArray(Array.prototype // true

| Array.prototype属性的属性特性 |

|:----|

| Writable | no |

| Enumerable | no |

| Configurable | no |

属性

Array.prototype.constructor所有的数组实例都继承了这个属性,它的值就是Array,表明了所有的数组都是由Array构造出来的。

方法

会改变自身的方法

下面的这些方法会改变调用它们的对象自身的值:

Array.prototype.copyWithin()在数组内部,将一段元素序列拷贝到另一段元素序列上,覆盖原有的值。

不会改变自身的方法

下面的这些方法绝对不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值。

Array.prototype.concat()返回一个由当前数组和其它若干个数组或者若干个非数组值组合而成的新数组。

遍历方法

在下面的众多遍历方法中,有很多方法都需要指定一个回调函数作为参数。在每一个数组元素都分别执行完回调函数之前,数组的length属性会被缓存在某个地方,所以,如果你在回调函数中为当前数组添加了新的元素,那么那些新添加的元素是不会被遍历到的。此外,如果在回调函数中对当前数组进行了其它修改,比如改变某个元素的值或者删掉某个元素,那么随后的遍历操作可能会受到未预期的影响。总之,不要尝试在遍历过程中对原数组进行任何修改,虽然规范对这样的操作进行了详细的定义,但为了可读性和可维护性,请不要这样做。

Array.prototype.entries()返回一个数组迭代器对象,该迭代器会包含所有数组元素的键值对。

通用方法

在 JavaScript 中,很多的数组方法被故意设计成是通用的。也就是说,那些看起来像是数组的对象(类数组对象),即拥有一个length属性,以及对应的索引属性(也就是数字类型的属性,比如obj[5])的非数组对象也是可以调用那些数组方法的。其中一些数组方法,比如说join方法,它们只会单纯的读取当前对象的length属性和索性属性的值,并不会尝试去改变这些属性的值。而另外一些数组方法,比如说reverse方法,它们会尝试修改那些属性的值,因此,如果当前对象是个String对象,那么这些方法在执行时就会报错,因为字符串对象的length属性和索引属性都是只读的。

规范

SpecificationStatusComment
ECMAScript 1st Edition (ECMA-262)StandardInitial definition.
ECMAScript 5.1 (ECMA-262)The definition of 'Array.prototype' in that specification.Standard
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Array.prototype' in that specification.StandardAdded the copyWithin(), fill(), entries(), keys(), values(), find(), findIndex() methods.
ECMAScript Latest Draft (ECMA-262)The definition of 'Array.prototype' in that specification.Living StandardAdded the includes() method.

浏览器兼容性

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic Support(Yes)(Yes)(Yes)(Yes)(Yes)(Yes)

FeatureAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic Support(Yes)(Yes)(Yes)(Yes)(Yes)(Yes)(Yes)