Array
数组的标准定义是一个存储元素的线性集合,元素可以通过索引来任意的存取,索引通常是数字,用来计算元素之间存储位置的偏移量。
JavaScript中的数组严格的说是一种特殊的对象,用来表示偏移量的是该对象的属性。JavaScript中的数组效率上不如其他语言中的数组高。
数组创建
avaScript创建数组的方式非常灵活,下面是常见的创建方式
var arr=[];
var arr=[1,2,3,4,"string",boolean]
var arr=new Array()
var arr=new Array(10)
//arr=[undefined *10]
var arr=new Array(1,2,3)
//arr=[1,2,3]
//创建数组,推荐使用[]操作符。这样的效率会更高
Array 构造函数只有一个参数值时的表现?
Array 构造函数只带一个数字参数的时候,该参数会被作为数组的预设长度(length),而非只充当数组中的一个元素。这样创建出来的只是一个空数组,只不过它的 length 属性被设置成了指定的值。
构造函数 Array(..) 不要求必须带 new 关键字。不带时,它会被自动补上。
数组的复制
数组是引用类型,复制数组只是为被复制的数组增加了新的引用,比如说
var a=[1,2,3,4,5]
var b=a;
b.push(6);
console.log(a); //[1,2,3,4,5,6]
console.log(b); //[1,2,3,4,5,6]
数组的属性
Array的方法
方法归类
常用的
- forEach
- map
- reduce
- filter
- reverse,sort
- pop,push,shift,unshift
- 分类:toString,toLocalString,join
修改器方法
下面的这些方法会改变调用它们的对象自身的值:
Array.prototype.pop()
删除数组的最后一个元素,并返回这个元素。Array.prototype.push()
在数组的末尾增加一个或多个元素,并返回数组的新长度。Array.prototype.reverse()
颠倒数组中元素的排列顺序,即原先的第一个变为最后一个,原先的最后一个变为第一个。Array.prototype.shift()
删除数组的第一个元素,并返回这个元素。Array.prototype.sort()
对数组元素进行排序,并返回当前数组。Array.prototype.splice()
在任意的位置给数组添加或删除任意个元素。Array.prototype.unshift()
在数组的开头增加一个或多个元素,并返回数组的新长度。Array.prototype.copyWithin()
在数组内部,将一段元素序列拷贝到另一段元素序列上,覆盖原有的值。Array.prototype.fill()
将数组中指定区间的所有元素的值,都替换成某个固定的值。访问方法
下面的这些方法绝对不会改变调用它们的对象的值,只会返回一个新的数组或者返回一个其它的期望值。
Array.prototype.concat()
返回一个由当前数组和其它若干个数组或者若干个非数组值组合而成的新数组。Array.prototype.join()
连接所有数组元素组成一个字符串。Array.prototype.slice()
抽取当前数组中的一段元素组合成一个新数组。[Array.prototype.toString()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/toString)
返回一个由所有数组元素组合而成的字符串。遮蔽了原型链上的Object.prototype.toString()
方法。Array.prototype.toLocaleString()
返回一个由所有数组元素组合而成的本地化后的字符串。遮蔽了原型链上的Object.prototype.toLocaleString()
方法。Array.prototype.indexOf()
返回数组中第一个与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1。Array.prototype.lastIndexOf()
返回数组中最后一个(从右边数第一个)与指定值相等的元素的索引,如果找不到这样的元素,则返回 -1。Array.prototype.includes()
判断当前数组是否包含某指定的值,如果是返回true
,否则返回false
。Array.prototype.toSource()
返回一个表示当前数组字面量的字符串。遮蔽了原型链上的Object.prototype.toSource()
方法。迭代方法
在下面的众多遍历方法中,有很多方法都需要指定一个回调函数作为参数。在每一个数组元素都分别执行完回调函数之前,数组的length属性会被缓存在某个地方,所以,如果你在回调函数中为当前数组添加了新的元素,那么那些新添加的元素是不会被遍历到的。此外,如果在回调函数中对当前数组进行了其它修改,比如改变某个元素的值或者删掉某个元素,那么随后的遍历操作可能会受到未预期的影响。总之,不要尝试在遍历过程中对原数组进行任何修改,虽然规范对这样的操作进行了详细的定义,但为了可读性和可维护性,请不要这样做。
Array.prototype.forEach()
为数组中的每个元素执行一次回调函数。Array.prototype.every()
如果数组中的每个元素都满足测试函数,则返回true
,否则返回false。
Array.prototype.some()
如果数组中至少有一个元素满足测试函数,则返回 true,否则返回 false。Array.prototype.filter()
将所有在过滤函数中返回true
的数组元素放进一个新数组中并返回。Array.prototype.map()
返回一个由回调函数的返回值组成的新数组。Array.prototype.reduce()
从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的返回值。Array.prototype.reduceRight()
从右到左为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的返回值。Array.prototype[@@iterator]()
和上面的 values() 方法是同一个函数。Array.prototype.values()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的值。Array.prototype.entries()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键值对。Array.prototype.find()
找到第一个满足测试函数的元素并返回那个元素的值,如果找不到,则返回undefined
。Array.prototype.findIndex()
找到第一个满足测试函数的元素并返回那个元素的索引,如果找不到,则返回-1
。Array.prototype.keys()
返回一个数组迭代器对象,该迭代器会包含所有数组元素的键。
方法详解
Array.prototype.slice
Array.prototype.slice2 = function (start, end) {
const length = this.length;
let l = start === undefined ? 0 :
start < 0 ? Math.max(start + length, 0) : Math.min(start, length);
const r = end === undefined ? length :
end < 0 ? Math.max(end + length, 0) : Math.min(end, length);
const res = [];
while (l < r) {
res.push(this[l++])
}
return res
};
Array.prototype.reduce
类数组对象
- 一个拥有 length 属性和若干索引属性的对象就可以被称为类数组对象,类数组对象和数组类似,但是不能调用数组的方法。
- 常见的类数组对象有 arguments 和 DOM 方法的返回结果,还有一个函数也可以被看作是类数组对象,因为它含有 length属性值,代表可接收的参数个数。
类数组转换为数组
- Array.from()
- Array.prototype.slice.call(arrayLike);
- Array.prototype.splice.call(arrayLike, 0);
- Array.prototype.concat.apply([], arrayLike);
详细的资料可以参考: 《JavaScript 深入之类数组对象与 arguments》 《javascript 类数组》 《深入理解 JavaScript 类数组》