最近也有整理一下js基础方面的意向,今天整理一下数组。
根据MDN进行整理:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype
1、属性
1.1 length
length 是Array的实例属性。返回或设置一个数组中的元素个数。该值是一个无符号 32-bit 整数,并且总是大于数组最高项的下标。
const clothing = ['shoes', 'shirts', 'socks', 'sweaters'];
console.log(clothing.length); // 4
2、创建数组方法
除了直接声明一个数组,使用Array.xxx
来声明的方法
2.1 from()
Array.from()
方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
Array.from([1, 2, 3]) // [1, 2, 3]
2.2 of()
Array.of()
方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型,返回一个新的 Array 实例。。
Array.of(7); // [7]
Array.of(1, 2, 3); // [1, 2, 3]
Array(7); // [ , , , , , , ]
Array(1, 2, 3); // [1, 2, 3]
3、isArray()
Array.isArray()
用于确定传递的值是否是一个 Array。
Array.isArray([1, 2, 3]);
// true
Array.isArray({foo: 123});
// false
Array.isArray("foobar");
// false
Array.isArray(undefined);
// false
4、修改器方法
修改器方法
是MDN的词,可以理解为会修改源数组的方法,MDN原话会改变调用它们的对象自身的值
4.1 copyWithin()
copyWithin()
方法浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度。
arr.copyWithin(target[, start[, end]])
let arr = [1,2,3,4,5,6,7];
arr.copyWithin(0, 5, 6);
// [6, 2, 3, 4, 5, 6, 7]
4.2 fill()
fill()
方法用一个固定值value
填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引。
arr.fill(value[, start[, end]])
let arr = [1,2,3,4,5,6,7];
arr.fill(10, 0, 1)
// [10, 2, 3, 4, 5, 6, 7]
4.3 pop()
pop()
方法从数组中删除最后一个元素,并返回该元素的值,从数组中删除的元素(当数组为空时返回undefined)。
let arr = [1,2,3,4,5,6,7];
let arr1 = arr.pop()
console.log(arr)
console.log(arr1)
// [1, 2, 3, 4, 5, 6]
// 7
4.4 push()
push()
方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
let arr = [1,2,3,4,5,6,7];
let arr1 = arr.push(8)
console.log(arr)
console.log(arr1)
// [1, 2, 3, 4, 5, 6, 7, 8]
// 8
4.5 reverse()
reverse()
方法将数组中元素的位置颠倒,并返回该数组。数组的第一个元素会变成最后一个,数组的最后一个元素变成第一个。该方法会改变原数组。
let arr = [1,2,3,4,5,6,7];
arr.reverse()
// [7, 6, 5, 4, 3, 2, 1]
4.6 shift()
shift()
方法从数组中删除第一个元素,并返回该元素的值。
let arr = [1,2,3,4,5,6,7];
console.log(arr.shift())
console.log(arr)
// 1
// [2, 3, 4, 5, 6, 7]
4.7 sort()
sort()
方法用原地算法对数组的元素进行排序,并返回数组。
arr.sort([compareFunction])
var numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => a - b);
console.log(numbers);
// // [1, 2, 3, 4, 5]
4.8 splice()
splice()
方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
- start: 指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位;如果负数的绝对值大于数组的长度,则表示开始位置为第0位。
- deleteCount: 整数,表示要移除的数组元素的个数。
- 要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。
let arr = [1,2,3,4,5,6,7];
console.log(arr.splice(1, 2))
console.log(arr)
// [2, 3]
// (5) [1, 4, 5, 6, 7]
// add
let arr = [1,2,3,4,5,6,7];
console.log(arr.splice(1, 2, 88, 99))
console.log(arr)
// [2, 3]
// [1, 88, 99, 4, 5, 6, 7]
4.9 unshift()
unshift()
方法将一个或多个元素添加到数组的开头,并返回该数组的新长度
let arr = [1,2,3,4,5,6,7];
console.log(arr.unshift( 88, 99))
console.log(arr)
// 9
// [88, 99, 1, 2, 3, 4, 5, 6, 7]
5、访问方法
不会修改源数组的方法,只会返回一个新的数组或者返回一个其它的期望值。
5.1 concat()
concat()
方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
var a = [1,2,3];
var b = [4,5,6];
console.log(a.concat(b))
// [1, 2, 3, 4, 5, 6]
ES6可以简写[...a, ...b]
5.2 includes()
includes()
方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。第二个参数是索引,从某处开始查找。
var a = [1,2,3];
console.log(a.includes(2))
console.log(a.includes(4))
// true
// false
5.3 join()
join()
方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串, 如果不传参数则默认,
,如果传空字符串""
则不使用连接符,其他传啥是啥。
var a = [1,2,3];
console.log(a.join())
console.log(a.join(''))
console.log(a.join('-'))
// 1,2,3
// 123
// 1-2-3
5.4 slice()
slice()
方法返回一个新的数组对象,接受两个参数,一个开始一个结束,根据参数的位置进行浅拷贝,返回拷贝后的数组。
var arr = [1,{a:1}, 2, 3];
var arr2 = arr.slice(1,2);
console.log(arr2)
console.log(arr)
console.log(arr2[0] == arr[1])
// [ {a: 1}]
// [1, {a: 1}, 2, 3]
// true
5.5 toSource()
toSource()
在调试时,你可以使用toSource方法来查看一个数组的内容,该特性是非标准的!
5.6 toString()
toString()
返回一个字符串,表示指定的数组及其元素。
var arr = [1,2,3];
arr.toString()
// "1,2,3"
5.7 toLocaleString()
toLocaleString()
返回一个字符串表示数组中的元素。数组中的元素将使用各自的 toLocaleString 方法转成字符串,这些字符串将使用一个特定语言环境的字符串(例如一个逗号 “,”)隔开。
MDN上的例子:
const array1 = [1, 'a', new Date('21 Dec 1997 14:12:00 UTC')];
const localeString = array1.toLocaleString('en', {timeZone: "UTC"});
console.log(localeString); // 1,a,12/21/1997, 2:12:00 PM
5.8 indexOf()
indexOf()
方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
var arr = ['a', 'b', 'c', 'd'];
console.log(arr.indexOf('b')); // 1
console.log(arr.indexOf('d')); // 3
5.9 lastIndexOf()
lastIndexOf()
方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。
arr.lastIndexOf(searchElement[, fromIndex])
var array = [2, 5, 9, 2];
console.log( array.lastIndexOf(2, 3))
console.log(array.lastIndexOf(2, 2))
// 3
// 0
6、迭代方法
有很多方法都需要指定一个回调函数作为参数。在每一个数组元素都分别执行完回调函数之前,数组的length属性会被缓存在某个地方,所以,如果你在回调函数中为当前数组添加了新的元素,那么那些新添加的元素是不会被遍历到的。此外,如果在回调函数中对当前数组进行了其它修改,比如改变某个元素的值或者删掉某个元素,那么随后的遍历操作可能会受到未预期的影响。总之,不要尝试在遍历过程中对原数组进行任何修改,虽然规范对这样的操作进行了详细的定义,但为了可读性和可维护性,请不要这样做。
6.1 forEach()
forEach()
方法对数组的每个元素执行一次给定的函数。
var arr = [1,2,3];
arr.forEach(item => console.log(item))
// 1
// 2
// 3
6.2 entries()
entries()
方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对。
var arr = [1,2,3];
console.log(arr.entries().next().value)
// [0, 1]
6.3 every()
every()
方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。
var arr = [1,2,3];
console.log(arr.every(item=>item>5)); // false
console.log(arr.every(item=>item<5)); // true
6.4 some()
some()
方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。
var arr = [1,2,3];
console.log(arr.some(item=>item>2))
console.log(arr.some(item=>item<2))
// true
// true
6.8 filter()
filter()
方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
var arr = [1,2,3];
console.log(arr.filter(item=>item>2))
// [3]
6.9 find()
find()
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。
arr.find(callback(item, index, arr), [this])
var arr = [1,2,3];
console.log(arr.find(item=>item>2))
// 3
6.10 findIndex()
findIndex()
方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
var arr = [1,2,3];
console.log(arr.findIndex(item=>item>2))
// 2
6.11 keys()
keys()
方法返回一个包含数组中每个索引键的Array Iterator对象。
var a1 = ['a', 'b', 'c'];
var iterator = a1.keys();
for (var key of iterator) {
console.log(key);
}
// 0
// 1
// 2
6.12 map()
map()
方法创建一个新数组,其结果是该数组中的每个元素都调用一次提供的函数后的返回值。
var arr = [1,2,3];
arr.map(item=>item*2)
// [2, 4, 6]
6.13 reduce()
reduce()
方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
var arr = [1,2,3];
arr.reduce((a,b)=>a+b)
// 6
6.14 reduceRight()
reduceRight()
方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。
arr.reduceRight(callback(accumulator, currentValue[, index[, array]])[, initialValue])
[0, 1, 2, 3, 4].reduceRight(function(previousValue, currentValue, index, array) {
return previousValue + currentValue;
});
// 10
6.15 values()
values()
方法返回一个新的 Array Iterator 对象,该对象包含数组每个索引的值,返回一个新的 Array 迭代对象。
const array1 = ['a', 'b', 'c'];
const iterator = array1.values();
for (const value of iterator) {
console.log(value);
}
// a
// b
// c