所有的数组实例都继承于 Array.prototype。
所有的数组方法都定义在 Array.prototype 身上,
和其他的构造函数一样,你可以通过扩展 Array 的 prototype 属性上的方法来给所有数组实例增加方法。
Array.prototype 本身也是个数组。
Array.isArray(Array.prototype); // true
Array.prototype.constructor
所有的数组实例都继承了这个属性,
它的值就是 Array,
表明了所有的数组都是由 Array 构造出来的。
Array.prototype.length
上面说了,因为 Array.prototype 也是个数组,所以它也有 length 属性,
这个值为 0,因为它是个空数组。
会改变自身的方法
下面的这些方法会改变调用它们的对象自身的值:
Array.prototype.copyWithin()
在数组内部,将一段元素序列拷贝到另一段元素序列上,覆盖原有的值。
Array.prototype.fill()
将数组中指定区间的所有元素的值,都替换成某个固定的值。
Array.prototype.pop()
删除数组的最后一个元素,并返回这个元素。
Array.prototype.push()
在数组的末尾增加一个或多个元素,并返回数组的新长度。
Array.prototype.reverse()
颠倒数组中元素的排列顺序,即原先的第一个变为最后一个,原先的最后一个变为第一个。
Array.prototype.shift()
删除数组的第一个元素,并返回这个元素。
Array.prototype.sort()
对数组元素进行排序,并返回当前数组。
Array.prototype.splice()
在任意的位置给数组添加或删除任意个元素。
Array.prototype.unshift()
在数组的开头增加一个或多个元素,并返回数组的新长度。
不会改变自身的方法
下面的这些方法绝对不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值。
Array.prototype.concat()
返回一个由当前数组和其它若干个数组或者若干个非数组值组合而成的新数组。
Array.prototype.includes()
判断当前数组是否包含某指定的值,如果是返回 true,否则返回 false。
Array.prototype.join()
连接所有数组元素组成一个字符串。
Array.prototype.slice()
抽取当前数组中的一段元素组合成一个新数组。
Array.prototype.toSource()
返回一个表示当前数组字面量的字符串。遮蔽了原型链上的 Object.prototype.toSource() 方法。
Array.prototype.toString()
返回一个由所有数组元素组合而成的字符串。遮蔽了原型链上的 Object.prototype.toString() 方法。
Array.prototype.toLocaleString()
返回一个由所有数组元素组合而成的本地化后的字符串。遮蔽了原型链上的 Object.prototype.toLocaleString() 方法。
Array.prototype.indexOf()
返回数组中第一个与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1。
Array.prototype.lastIndexOf()
返回数组中最后一个(从右边数第一个)与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1。
遍历方法
在下面的众多遍历方法中,有很多方法都需要指定一个回调函数作为参数。在回调函数执行之前,
数组的长度会被缓存在某个地方,所以,如果你在回调函数中为当前数组添加了新的元素,
那么那些新添加的元素是不会被遍历到的。此外,如果在回调函数中对当前数组进行了其它修改,
比如改变某个元素的值或者删掉某个元素,那么随后的遍历操作可能会受到未预期的影响。总之,
不要尝试在遍历过程中对原数组进行任何修改,虽然规范对这样的操作进行了详细的定义,但为了可读性和可维护性,请不要这样做。
Array.prototype.forEach()
为数组中的每个元素执行一次回调函数。
Array.prototype.entries()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键值对。
Array.prototype.every()
如果数组中的每个元素都满足测试函数,则返回 true,否则返回 false。
Array.prototype.some()
如果数组中至少有一个元素满足测试函数,则返回 true,否则返回 false。
Array.prototype.filter()
将所有在过滤函数中返回 true 的数组元素放进一个新数组中并返回。
Array.prototype.find()
找到第一个满足测试函数的元素并返回那个元素的值,如果找不到,则返回 undefined。
Array.prototype.findIndex()
找到第一个满足测试函数的元素并返回那个元素的索引,如果找不到,则返回 -1。
Array.prototype.keys()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键。
Array.prototype.map()
返回一个由回调函数的返回值组成的新数组。
Array.prototype.reduce()
从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,
并返回最后一次回调函数的返回值。
Array.prototype.reduceRight()
从右到左为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,
并返回最后一次回调函数的返回值。
Array.prototype.values()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的值。
Array.prototype[@@iterator]()
和上面的 values() 方法是同一个函数。
在JavaScript中可以用prototype来扩展已有类增加自己的方法,在这里提供对Array的扩展可减少许多工作量。
<script>
/*
* 方法:Array.removeAt(Index)
* 功能:删除数组元素.
* 参数:Index删除元素的下标.
* 返回:在原数组上修改数组
*/
Array.prototype.removeAt = function (Index) {
if (isNaN(Index) || Index > this.length) {
return false;
}
for (var i = 0, n = 0; i < this.length; i++) {
if (this[i] != this[Index]) {
this[n++] = this[i]
}
}
this.length -= 1
}
/*
* 方法:Array.remove(obj)
* 功能:删除数组元素.
* 参数:要删除的对象.
* 返回:在原数组上修改数组
*/
Array.prototype.remove = function (obj) {
if (null == obj) {
return;
}
for (var i = 0, n = 0; i < this.length; i++) {
if (this[i] != obj) {
this[n++] = this[i];
}
}
this.length -= 1;
}
/*
* 方法:Array.Contains(obj)
* 功能:确定某个元素是否在数组中.
* 参数:要查找的Object对象
* 返回:找到返回true,否则返回false;
*/
Array.prototype.Contains = function (obj) {
if (null == obj) {
return;
}
for (var i = 0, n = 0; i < this.length; i++) {
if (this[i] != obj) {
return true;
}
}
return false;
}
/*
* 方法:Array.IndexOf(obj)
* 功能:搜索指定的Object,并返回第一个匹配项从零开始的索引
* 参数:要查找的Object对象
* 返回:找到返回该元素在数组中的索引,否则返回-1
*/
Array.prototype.IndexOf = function (obj) {
if (null == obj) {
return;
}
{
for (var i = 0, n = 0; i < this.length; i++) {
if (this[i] == obj) {
return i;
}
}
}
return -1;
}
/*
* 方法:Array.Clear()
* 功能:消空数组元素.
* 参数:无.
* 返回:空数组
*/
Array.prototype.Clear = function () {
this.length = 0;
}
</script>
Array是类名,而不是对象名,所以不能直接用Array.slice。
Array.prototype:就是Array的原型.
内置的类型可以通过prototype找到内置的属性方法,
Array.prototype.slice这句就是访问Array的内置方法slice
Array.prototype.slice.call(arguments,0) 这句里,就是把 arguments 当做当前对象.也就是说 要调用的是 arguments 的slice 方法,后面的 参数 0 也就成了 slice 的第一个参数slice(0)就是获取所有.
slice 经常用来将 array-like 对象转换为 true array。在一些框架中会经常有这种用法。
Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组.
Array.prototype.slice.call(arguments,0);
将参数转换成真正的数组.
call的作用是改变this的指向,就相当于arguments(自身没有slice方法)调用了slice这个方法。
0就是start=0,end没指定,所以返回整个arguments,这个时候就转换成数组了。
Array.prototype.slice.apply的使用方法
arguments在JavaScript语法中是函数特有的一个对象属性(Arguments对象),用来引用调用该函数时传递的实际参数.apply():第一个参数是作用域,第二个是参数数组,其中第二个参数可以是数组实例,也可以是arguments对象。
apply和call的区别:
对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如
func.call(func1,var1,var2,var3)
//对应的apply写法为:
func.apply(func1,[var1,var2,var3])
其他例子:
var a={length:2,0:'first',1:'second'};
Array.prototype.slice.call(a);
// ["first", "second"]
var a={length:2};
Array.prototype.slice.call(a);
// [undefined, undefined]
slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组
<script>
var toArray = function (s) {
try {
return Array.prototype.slice.call(s);
} catch (e) {
var arr = [];
for (var i = 0, len = s.length; i < len; i++) {
//arr.push(s[i]);
arr[i] = s[i]; //比push快
}
return arr;
}
}
</script>