guoshuai93 / blog

19 stars 2 forks source link

深入了解之数组API #12

Open guoshuai93 opened 7 years ago

guoshuai93 commented 7 years ago

数组是 javascript 中很重要的一种对象,本篇总结了几乎所有的数组方法(包括最新的),这里把这些方法分成几类:

执行后会修改原数组的

.toString

toString() 返回一个字符串,表示指定的数组及其元素。

.push

push() 方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

.pop

pop() 方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。

console.log(myFish); // ["angel", "clown", "mandarin"]


#### `.shift`
`shift()` 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
- 语法
```js
arr.shift()

console.log('调用 shift 之后: ' + myFish);


#### `.unshift`
`unshift()` 方法将一个或多个元素添加到数组的开头,并返回新数组的长度。
- 语法
```js
arr.unshift(element1, ..., elementN)

arr.unshift(-2, -1); // = 5 //arr is [-2, -1, 0, 1, 2]


#### `.reverse`
`reverse()` 方法将数组中元素的位置颠倒。
- 语法
```js
arr.reverse()

console.log(myArray) // ['three', 'two', 'one']


#### `.sort`
`sort()` 方法在适当的位置对数组的元素进行排序,并返回数组。 sort 排序不一定是稳定的。  
默认排序顺序是根据 **字符串Unicode码点**。
- 语法
```js
arr.sort() 
arr.sort(compareFunction)  // 用来指定按某种顺序进行排列的函数

var scores = [1, 10, 21, 2]; scores.sort(); // [1, 10, 2, 21]

// 比较数值大小 var numbers = [4, 2, 5, 1, 3]; numbers.sort(function(a, b) { return a - b; }); console.log(numbers);

// [1, 2, 3, 4, 5]


#### `.splice`
`splice()` 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。原数组被修改。
- 语法
```js
array.splice(start)
array.splice(start, deleteCount) 
array.splice(start, deleteCount, item1, item2, ...)

//从第 2 位开始删除 1 个元素,然后插入 "trumpet" removed = myFish.splice(2, 1, "trumpet"); //运算后的myFish: ["angel", "clown", "trumpet", "surgeon"] //被删除元素数组:["drum"]


#### `.fill`
`fill()` 方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。
- 语法
```js
arr.fill(value) 
arr.fill(value, start) 
arr.fill(value, start, end)

执行后不改变原数组

.concat

concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

// 还可以连接数组和非数组值 console.log(arr1.concat(1,arr2)) // ['a','b','1','c','d']


#### `.join`
`join()` 方法将数组(或一个类数组对象)的所有元素连接到一个字符串中。**join() 方法,不会改变原数组!**
- 语法
```js
str = arr.join()
// 默认为 ","
str = arr.join("")
// 分隔符 === 空字符串 ""
str = arr.join(separator)
// 分隔符

.slice

slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。
原始数组不会被修改。

var list1 = list(1, 2, 3); // [1, 2, 3]

`Array.prototype.slice.call(arguments)`,你也可以简单的使用 `[].slice.call(arguments)` 来代替。更多见 [Slice--MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)。

- 示例
```js
var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
var citrus = fruits.slice(1, 3);

// fruits contains ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
// citrus contains ['Orange','Lemon']

.forEach

forEach() 方法对数组的每个元素执行一次提供的函数。

array.forEach(callback[, thisArg])

- 备注

- 示例
```js
let a = ['a', 'b', 'c'];

a.forEach(function(element) {
    console.log(element);
});

.map

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

// roots is now [1, 2, 3] // numbers is still [1, 4, 9]


#### `.reduce`
`reduce()` 方法对累加器和数组中的每个元素 (从左到右)应用一个函数,将其减少为单个值。更多见 [Reduce--MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)。
- 语法
```js
array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)

.reduceRight

reduceRight() 方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。更多参见 Reduce--MDN

.every

every() 方法测试数组的所有元素是否都通过了指定函数的测试。

.some

some() 方法测试数组中的某些元素是否通过由提供的函数实现的测试。同every 方法互补。

[2, 5, 8, 1, 4].some(isBiggerThan10);
// false

[12, 5, 8, 1, 4].some(isBiggerThan10); // true


#### `.filter`
filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。
- 语法
```js
var new_array = arr.filter(callback[, thisArg])

.copyWithin

// start end 可选 // target: 目标位置,复制序列到该位置 // start: 开始复制元素的起始位置 // end: 开始复制元素的结束位置

- 备注

- 示例
```js
["alpha", "beta", "copy", "delta"].copyWithin(1, 2, 3);
// ["alpha", "copy", "copy", "delta"]

.entries

entries() 方法返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对。 更多参见 Entries--MDN

.keys

keys() 方法返回一个新的Array迭代器,它包含数组中每个索引的键。 更多参见 Entries--MDN

元素查找

.indexOf

indexOf() 方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1

.lastIndexOf

lastIndexOf() 方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1

[12, 5, 8, 130, 44].find(isBigEnough); // 130


#### `.findIndex`
`findIndex()` 方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。
- 语法
```js
arr.findIndex(callback[, thisArg])

[12, 5, 8, 130, 44].findIndex(isBigEnough); // 3

#### `.includes`
`includes()` 方法用来判断一个数组是否包含一个指定的值,如果是,酌情返回 true或 false。
- 语法
```js
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)

// searchElement: 查找元素
// fromIndex: 从该索引处开始查找

数组自身的方法

Array.isArray

用于确定传递的值是否是一个 Array

// 下面的函数调用都返回 false Array.isArray(); Array.isArray({}); Array.isArray(null); Array.isArray(undefined); Array.isArray(17); Array.isArray('Array'); Array.isArray(true);


#### `Array.from`
`Array.from()` 方法从一个类似数组或可迭代的对象中创建一个新的数组实例。
- 语法
```js
Array.from(arrayLike[, mapFn[, thisArg]])

let m = new Map([[1, 2], [2, 4], [4, 8]]); Array.from(m); // [[1, 2], [2, 4], [4, 8]]

function f() { return Array.from(arguments); }

f(1, 2, 3);

// [1, 2, 3]


#### `Array.of`
`Array.of()` 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。

`Array.of()` 和 `Array` 构造函数之间的区别在于处理整数参数:`Array.of(7)` 创建一个具有单个元素 7 的数组,而 `Array(7)` 创建一个包含 7 个 `undefined` 元素的数组。
- 语法
```js
Array.of(element0[, element1[, ...[, elementN]]])

Array(7); // [ , , , , , , ] Array(1, 2, 3); // [1, 2, 3]