Array对象
- 构造函数
- 静态方法
- 实例方法
-
- keys()、values()、entries()
- find()和findIndex()(返回数组满足函数的第一个元素,索引)
- includes()(数组是否包含参数元素)
- valueOf()和toString()(对象值和转字符串)
- push() 和pop()(从后面添加和删除)
- shift()和unShift()(从头删除和添加)
- join()(数组转字符串,指定分隔符)
- concat()(数组合并)
- reverse()(数组反序)
- slice() (截取数组,原数组不变)
- splice()(截取数组,修改原数组)
- sort()(数组按照字典顺序排序)
- map()(遍历数组,根据需求返回新数组)
- forEach() (遍历数组,没有返回值)
- filter()(数组过滤)
- some(),every()(任意满足和全都满足)
- reduce(),reduceRight()(依次处理和反向依次处理)
- indexOf(),lastIndexOf()(元素第一次和最后一次出现的位置,没有则返回-1)
- 链式使用
- 使用Set去重
构造函数
Array是JS的一个原生对象,同时也是一个构造函数。可以通过new操作符进行变量声明
var arr = new Array(2);
arr.length // 2
arr // [ empty x 2 ]
作为构造函数,如果参数为一个整数,则返回一个数组,数组元素的各位为参数。
var arr = new Array(2);
// 等同于
var arr = Array(2);
如上,两种结果是一样的。从语义化触发,还是建议使用new进行声明。
但是,Array()构造函数有一个很大的缺陷,不同的参数会导致行为不一致。
// 无参数时,返回一个空数组
new Array() // []
// 单个正整数参数,表示返回的新数组的长度
new Array(1) // [ empty ]
new Array(2) // [ empty x 2 ]
// 非正整数的数值作为参数,会报错
new Array(3.2) // RangeError: Invalid array length
new Array(-3) // RangeError: Invalid array length
// 单个非数值(比如字符串、布尔值、对象等)作为参数,
// 则该参数是返回的新数组的成员
new Array('abc') // ['abc']
new Array([1]) // [Array[1]]
// 多参数时,所有参数都是返回的新数组的成员
new Array(1, 2) // [1, 2]
new Array('a', 'b', 'c') // ['a', 'b', 'c']
如上可以看出,Array()作文构造函数,行为很不一致,所以还是比较推荐使用字面量的形式声明,如下
// bad
var arr = new Array(1, 2);
// good
var arr = [1, 2];
注意,如果参数是一个正整数,返回数组的成员都是空位。虽然读取的时候返回undefined,但实际上该位置没有任何值。虽然这时可以读取到length属性,但是取不到键名
静态方法
Array.isArray()(判断参数是否为数组)
Array.isArray()返回值为Boolean型,用于判断参数是否为数组,弥补typeof判断数组结果为object的不足。
const a = [1,2,3,4,5];
console.log(typeof a); //object
console.log(Array.isArray(a)); //true
实例方法
keys()、values()、entries()
和Object的Object.keys()、Object.values()、Object.entries()一致,因为Array本身就是Objec的一个实例,可以说Array的三个方法是级车和关于Object。
- keys():返回数组所有键值构成的数组
- values():返回数组元素构成的数组
- entries()返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对。
find()和findIndex()(返回数组满足函数的第一个元素,索引)
find()和findIndex()的参数都是函数,函数的结果为我们匹配的条件,我们可以配合箭头函数表示。
find方法对数组中的每一项元素执行一次 callback 函数,直至有一个 callback 返回 true。当找到了这样一个元素后,该方法会立即返回这个元素的值,否则返回 undefined。
注意 callback 函数会为数组中的每个索引调用即从 0 到 length - 1,而不仅仅是那些被赋值的索引,这意味着对于稀疏数组来说,该方法的效率要低于那些只遍历有值的索引的方法。
如果提供了 thisArg参数,那么它将作为每次 callback函数执行时的this ,如果未提供,则使用 undefined。
const arr = [1,23,4,5,23,3,5,2];
const j = arr.find(item=>item>10);
console.log(j); //23
const i = arr.findIndex(item=>item>10);
console.log(i); //1
如上,j取了arr中第一个元素23,i表示满足函数条件的第一个元素的索引。
function callback(element,index,arr){
}
arr.find(callback, thisArg)
如上,函数包括四个参数:
- element:当前遍历的元素,必选。
- index:当前遍历元素索引,可选。
- arr:当前正在遍历的数组,可选。
includes()(数组是否包含参数元素)
includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
const array1 = [1, 2, 3];
console.log(array1.includes(2));
// expected output: true
const pets = ['cat', 'dog', 'bat'];
console.log(pets.includes('cat'));
// expected output: true
console.log(pets.includes('at'));
// expected output: false
Arr.includes(valueToFind,fromIndex )
两个参数:
valueToFind:表示要判断的数组元素,
fromIndex :表示查找的起始位置,如果为负值,则按升序从 array.length + fromIndex 的索引开始搜 (即使从末尾开始往前跳 fromIndex 的绝对值个索引,然后往后搜寻)。默认为 0。
valueOf()和toString()(对象值和转字符串)
valueOf方法是一个所有对象都拥有的方法,表示对该对象求值。不同对象的valueOf方法不尽一致,数组的valueOf方法返回数组本身。
var arr = [1, 2, 3];
arr.valueOf() // [1, 2, 3]
toString方法也是对象的通用方法,数组的toString方法返回数组的字符串形式。
var arr = [1, 2, 3];
arr.toString() // "1,2,3"
var arr = [1, 2, 3, [4, 5, 6]];
arr.toString() // "1,2,3,4,5,6"
push() 和pop()(从后面添加和删除)
push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。
var arr = [];
arr.push(1) // 1
arr.push('a') // 2
arr.push(true, {
}) // 4
arr // [1, 'a', true, {}]
上面代码使用push方法,往数组中添加了四个成员。
pop方法用于删除数组的最后一个元素,并返回该元素。注意,该方法会改变原数组。
var arr = ['a', 'b', 'c'];
arr.pop() // 'c'
arr // ['a', 'b']
对空数组使用pop方法,不会报错,而是返回undefined。
[].pop() // undefined
push和pop结合使用,就构成了“后进先出”的栈结构(stack)。
var arr = [];
arr