js数组的长度可以动态改变,不需要指定分配内存空间的长度。
1. 新建数组的方式:
一: new Array形式。
1.) var a = new Array(args)
如果args是数字,那么指定的是长度。
new Array(1) ; ====> 数组长度为1 ,值默认为undefined
如果args是其他,则作为元素,
new Array('red','blue') ;====》['red' , 'blue']
二: 字面量形式
var a = ['a', 'b', 'c']
2.数组的属性:
1.) length属性:数组的长度
var a = [1,2,3,4]
console.log(a.length) ; ====> 4
a.length = n ; ====>此时只保留数组前n位,或者数组长度不足n位,则扩充至n位,默认undefined
3.判断一个是否是数组
var a = [];
1.) 使用 instanceof :
a instanceof Array ; ====> true
2.) Array.isArray:
Array.isArray( a ) ; true
3.)通用的判断数据类型方式:
Object.prototype.toString.call(a);===>"[object Array]"
4. 数组转换
对象都具有toString() , valueOf() ,toLocalString()方法,
数组也有
1.) toString将数组变成字符串,使用逗号拼接。
var a = [1, 2, 3]
a.toString() ; "1,2,3" ;变成了字符串。
2.)valueOf 不变。
3.) toLocalString针对的是数组中的项。
4.) join拼接:默认使用逗号拼接。还可以扁平化数组。
var a = [1,2,3];
a.join('') ; '123' ;join单引号不带参数即,直接相连
a.join(','); '1,2,3' ;使用逗号拼接。等同 a.join()
b = [1,2,3,[4,5]]
b.join() ; "1,2,3,4,5"
5.栈和队列方法:
1.) push: 末尾添加
a.push('1');
a.push('2', ‘3’);
2.) pop: 末尾删除
a.pop();删除最后一位
3.)shift: 第一项删除
a.shift()
4.) unshift(): 从最前面添加
a.unshift(3)
a.unshift(4,5)
6. 排序
1.) 数组反转:reverse
a = [1,2,3]
a.reverse(); [3,2,1]
2.) 排序sort, 默认按照字符串值大小排序
a = [1,2,10,3,30,4]
a.sort() ; [1,10,2,3,30,4]
自定义排序规则:
function cmp(value1,value2) {
if(value1>value2) {
return 1
} else if(value1<value2){
return -1
} else {
return 0
}
} ; ===》 更简: function cmp(v1,v2) { return v1-v2 }
var a = [1,2,10,4]
console.log(a.sort()) ;//[ 1, 10, 2, 4 ]
console.log(a.sort(cmp)); //[ 1, 2, 4, 10 ]
7. 拷贝和删除
1.) concat: 不修改原数组
var a = [1,2,3]
var b = a.concat(4,[5,6])
a; ===> [1, 2, 3]
b;===> [1, 2, 3, 4, 5, 6]
a.concat() ; 复制全部。
2.) slice(arg1, arg2):方法返回起始和结束位置之间的项— —但不包括结束位置的项
var a = [1,2,3];
a.slice(1) ; [2, 3] 即从a[1] 开始复制到数组末尾
var b = ['a','b','c','d'] ;
b.slice(2,3) ; ["c"] 不包括 b[3]
如果slice方法的参数中有一个负数,则用length的值和它相加。
如length为5,slice(-2,-1)和slice(3,4)相同。
如果结束位置(第二参数),小于起始位置(第一个参数),返回空数组。
a.slice() 复制全部
3.) splice(删除, 插入, 替换)
var a = [1,2,3]
a.splice(1,1,'留1','留3')
a ;[1, "留1", "留3", 3]
8.获取索引:
1.) indexOf() , lastIndexOf(): 查找元素在数组的中索引。
var a = ['a', 'b' ,'c']
a.indexOf('c') ; 2
两种方法,只是查找方向不同。
9.迭代方法
以下函数都是对数组中的每一项运行给定的回调函数
every() :,如果函数对每一项返回true,才最终返回true.
filter() : 返回回调函数返回true的项组成的数组
map(): 返回回调函数运算返回的结果组成的数组
forEach:没有返回值。
some(): 对任一项返回true,则返回true.
var a = [1,2,3]
var b = a.map( (item,index,array) => { return item*2 })
b; [2, 4, 6]
reuduce()和reduceRight()
回调函数,有四个参数:前一个值,当前值,索引,数组对象;
从第二项开始运算的。
var a = [1,2,3,4]
var b = a.reduce((pre,cur,index,array) => { console.log(cur); return pre+cur})
b; 10
10 扩展运算符 …
作用: 数组展开。
var a = [1,2,3]
var b = [0,...a]
b; [0,1,2,3]
替代apply:
function add(x,y,z) {
return x+y+z
}
var args = [1,2,3]
var result = add.apply(null,args)
console.log(result) ;6
var result = add(...args);
console.log(result); 6
解构:
a = [1,2,3,4]
[b,...c] =a
b ; 1
c ; [2, 3, 4]
字符串转数组:
var s = 'hello'
[...s] ; ["h", "e", "l", "l", "o"]
11 Array.from
Array.from方法用于将两类对象转为真正的数组:
类数组的对象(array-like object)
可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
任何有length属性的对象,都可以通过Array.from方法转为数组
12 Array.of
Array.of方法用于将一组值,转换为数组。
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
13 copyWithin
Array.prototype.copyWithin(target, start = 0, end = this.length)
数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]
// 将3号位复制到0号位
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]
14 find 和 findIndex
数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员
[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}) // 2
15 includes
Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,
与字符串的includes方法类似
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
[1, 2, NaN].includes(NaN) // true
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
16 flat和flatMap: 数组扁平化
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]