根据个人在实际开发过程中,对于Array对象的方法使用比较多的,以及出现过的问题在这里做个简单介绍。(属于个人笔记,许多方法已经熟练的就只是列出来没有详细介绍)
一、ES5
- 不会改变原数组的方法。
1.1 contact
参数:arrayX
说明:返回一个新的数组。
1.2 join
参数:separator
(分隔符)
说明:返回一个字符串。
1.3 slice
参数:start
,end
(可选)
说明:返回一个新的数组。参数可以为负数。开发过程中经常用slice()
复制数组。
let A = [1,2,3];
let B = A.slice(1)
- 会改变原数组的方法。
2.1 pop
参数:none
说明:删除数组最后一个元素,数组长度减一,并返回被删除的元素,如果原数组为空,返回undefined。
2.2 push
参数:newElemmentX
说明:按照参数的先后顺序添加到数组末尾,返回新数组的长度。
2.3 reverse
参数:none
说明:颠倒数组的元素。无返回值。
2.4 shift
参数:none
说明:删除原数组第一个元素,并返回被删除的元素。
2.5 sort
参数:sortby
(可选)
说明:调用sort()
前,数字每个元素会调用toString()
方法。如果没有参数,将按照字符编码的顺序进行排序。
var a=[1,2,3,'j','A',10,5,3];
a.sort() // [1, 10, 2, 3, 3, 5, "A", "j"]
如果有参数,参数必须是一个比较函数。
var a=[1,2,3,'j','A',10,5,3];
//降序函数
var desc = function(x,y)
{
if (x > y)
return -1; //返回一个小于0 的数即可
else
return 1; //返回一个大于0 的数即可
}
//升序函数
var asc = function(x,y)
{
if (x > y)
return 1; //返回一个大于0 的数即可
else
return -1; //返回一个小于0 的数即可
}
a.sort(desc);//[10, 5, 3, "j", "A", 3, 2, 1]
a.sort(asc);//[3, 5, 10, "A", "j", 1, 2, 3]
2.6 splice
参数:index
,howmany
,newElemmentX
(可选)
说明:返回被删除的元素组成的数组,如果没有进行删除操作,返回一个空数组。
2.7 unshift
参数:newElemmentX
说明:返回添加完后数组的长度。
二、 ES6
注:这部分是我参考阮一峰老师的[ECMAScript 6 入门]文章,自己记录的笔记,详细的内容请移步阮一峰老师的文章。
- 扩展运算符(...)。将一个数组转为用逗号分隔的参数序列。
console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]
该运算符主要用于函数调用。
function push(array, ...items) {
array.push(...items);
}
function add(x, y) {
return x + y;
}
var numbers = [4, 38];
add(...numbers) // 42
替代apply()方法
//es5
function arr(x,y,z){
return x+y+z
}
var array=[1,2,3];
arr.apply(null,array);
//es6
arr(...array)
替代push()方法
var arr1=[1,2,3];
var arr2=[4,5,6];
arr1.push(...arr2)
- 扩展运算符的应用
(1) 合并数组
var arr1=[1,2];
var arr2=[3,4];
var arr3=[5,6];
//es5
arr1.concat(arr2,arr3)
//es6
[...arr1,...arr2,...arr3]
(2) 与解构赋值结合
const [a,...b]=[1,2,3,4,5];
//a=1 b=[2,3,4,5]
const [a,...b]=[]
//a=undefined b=[]
const [a,...b]=[1]
//a=1 b=[]
(3) 字符串
[...'v1ta']
// ['v',1,'t','a']
(4) 实现了 Iterator 接口的对象
(5) Map 和 Set 结构,Generator 函数
- Array.form()
Array.from
方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)
下面是一个类似数组的对象,Array.from
将它转为真正的数组。
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
//or Array.prototype.slice.call(arrayLike)
// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
实际应用中,常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的arguments
对象。Array.from
都可以将它们转为真正的数组。
// NodeList对象
let ps = document.querySelectorAll('p');
Array.from(ps).forEach(function (p) {
console.log(p);
});
// arguments对象
function foo() {
var args = Array.from(arguments);
// ...
}
上面代码中,querySelectorAll()
方法返回的是一个类似数组的对象,可以将这个对象转为真正的数组,再使用forEach方法。
只要是部署了Iterator接口的数据结构,Array.from
都能将其转为数组。
Array.from('hello')
// ['h', 'e', 'l', 'l', 'o']
let namesSet = new Set(['a', 'b'])
Array.from(namesSet) // ['a', 'b']
上面代码中,字符串和Set结构都具有Iterator接口,因此可以被Array.from转为真正的数组。
值得提醒的是,扩展运算符(...)也可以将某些数据结构转为数组。
// arguments对象
function foo() {
var args = [...arguments];
}
// NodeList对象
[...document.querySelectorAll('div')]
扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from
方法还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from
方法转为数组,而此时扩展运算符就无法转换。
Array.from({ length: 3 });
// [ undefined, undefined, undefined ]
Array.from
还可以接受第二个参数,作用类似于数组的map()
方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);
Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]
下面的例子是取出一组DOM节点的文本内容。
let spans = document.querySelectorAll('span.name');
// map()
let names1 = Array.prototype.map.call(spans, s => s.textContent);
// Array.from()
let names2 = Array.from(spans, s => s.textContent)
Array.from()可以将各种值转为真正的数组,并且还提供map功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。
Array.from({ length: 2 }, () => 'jack')
// ['jack', 'jack']
上面代码中,Array.from的第一个参数指定了第二个参数运行的次数。这种特性可以让该方法的用法变得非常灵活。
- Array.of()
Array.of
方法用于将一组值,转换为数组。
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
- copyWithin()
数组实例的copyWithin
方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。
它接受三个参数。
target(必需):从该位置开始替换数据。
start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。
end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
这三个参数都应该是数值,如果不是,会自动转为数值。
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]
上面代码表示将从3号位直到数组结束的成员(4和5),复制到从0号位开始的位置,结果覆盖了原来的1和2。
- find() 和 findIndex()
数组实例的find()
方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true
的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined
。
[1, 4, -5, 10].find((n) => n < 0)
// -5
上面代码找出数组中第一个小于0的成员。
[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10
上面代码中,find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。
数组实例的findIndex()
方法的用法与find()
方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}) // 2
- fill()
fill()
方法使用给定值,填充一个数组。
['a', 'b', 'c'].fill(7)
// [7, 7, 7]
new Array(3).fill(7)
// [7, 7, 7]